Zápis vlastností pomocou kúzel v OOP v PHP
Kúzelná metóda __set sa volá
pri pokuse o zmenu hodnoty neexistujúcej
alebo skrytej vlastnosti. Ako parametre
prijíma názov vlastnosti a hodnotu, ktorú
sa jej pokúšajú priradiť.
Pozrime sa na praktický príklad.
Majme danú takúto triedu Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Vytvorme v tejto triede kúzelnú
metódu __set, ktorá pomocou funkcie
var_dump vypíše názov vlastnosti,
ku ktorej došlo k prístupu, a hodnotu,
ktorú sa tejto vlastnosti pokúšajú nastaviť:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Otestujme fungovanie našej triedy:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump metódy __set vypíše 'prop value'
?>
Skúsme teraz nastaviť hodnotu
vlastnosti, ktorej názov je uložený v premennej
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // nastavíme hodnotu
}
}
?>
Teraz môžeme zapisovať do privátnych vlastností zvonku triedy:
<?php
$test = new Test;
$test->prop1 = 1; // zapíšeme 1
$test->prop2 = 2; // zapíšeme 2
?>
Zapisovať môžeme, avšak skontrolovať, či sa tam niečo zapisalo - nie, pretože vlastnosti sú privátne.
Môžeme vytvoriť getter pre tieto vlastnosti alebo
jednoducho použiť kúzelnú metódu
__get. Využime druhú možnosť:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Kúzelný getter vlastností:
public function __get($property)
{
return $this->$property;
}
}
?>
Až teraz môžeme skontrolovať fungovanie našej triedy. Skontrolujme:
<?php
$test = new Test;
$test->prop1 = 1; // zapíšeme 1
$test->prop2 = 2; // zapíšeme 2
echo $test->prop1; // vypíše 1
echo $test->prop2; // vypíše 2
?>
Samozrejme, v skutočnosti by sme nemali dovoliť komukoľvek zapisovať do privátnych vlastností, inak stráca zmysel ich súkromný charakter (jednoduchšie je urobiť ich verejnými a hotovo).
Preto by sa táto metóda mala používať iba vtedy, keď je to naozaj potrebné. V nasledujúcich lekciách si ešte rozoberieme príklady úspešného použitia.