Záznam vlastností pomocí magie v OOP v PHP
Magická metoda __set je volána
při pokusu o změnu hodnoty neexistující
nebo skryté vlastnosti. Jako parametry
přijímá název vlastnosti a hodnotu, která
se jí snaží přiřadit.
Podívejme se na praktickém příkladu.
Předpokládejme, že máme danou tuto třídu Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Vytvořme v této třídě magickou
metodu __set, která pomocí funkce
var_dump vypíše název vlastnosti,
ke které došlo k přístupu, a hodnotu,
která se této vlastnosti snaží nastavit:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Ověřme fungování naší třídy:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump metody __set vypíše 'prop value'
?>
Nyní zkusme nastavit hodnotu
vlastnosti, jejíž název je uložen v proměnné
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // nastavíme hodnotu
}
}
?>
Nyní můžeme zapisovat do privátních vlastností mimo třídu:
<?php
$test = new Test;
$test->prop1 = 1; // zapíšeme 1
$test->prop2 = 2; // zapíšeme 2
?>
Zapisovat můžeme, ale ověřit, zda se tam něco zapsalo - ne, protože vlastnosti jsou privátní.
Lze vytvořit getter pro tyto vlastnosti nebo
jednoduše použít magickou metodu
__get. Použijme druhou variantu:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Magický getter vlastností:
public function __get($property)
{
return $this->$property;
}
}
?>
Nyní můžeme ověřit fungování naší třídy. Ověřme:
<?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
?>
Samozřejmě, ve skutečnosti bychom neměli povolit všem zapisovat do privátních vlastností, jinak ztrácí smysl těchto privátních vlastností (jednodušší je udělat je veřejnými a hotovo).
Proto by se tato metoda měla používat pouze v případě, kdy je to skutečně nutné. V následujících lekcích ještě zvážíme příklady úspěšného použití.