Zapis lastnosti prek magije v OOP v PHP
Magična metoda __set se pokliče
pri poskusu spreminjanja vrednosti neobstoječe
ali skrite lastnosti. Kot parametre
sprejme ime lastnosti in vrednost, ki
jo ji poskušajo dodeliti.
Poglejmo si na praktičnem primeru.
Recimo, da imamo podan razred Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Naredimo v tem razredu magično
metodo __set, ki bo s pomočjo funkcije
var_dump izpisala ime lastnosti,
na katero je prišlo do dostopa, in vrednost,
ki jo tej lastnosti poskušajo nastaviti:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Preverimo delovanje našega razreda:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump metode __set bo izpisal 'prop value'
?>
Poskusimo sedaj nastaviti vrednost
lastnosti, katere ime je shranjeno v spremenljivki
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // nastavimo vrednost
}
}
?>
Sedaj lahko zunaj razreda pišemo v zasebne lastnosti:
<?php
$test = new Test;
$test->prop1 = 1; // zapišemo 1
$test->prop2 = 2; // zapišemo 2
?>
Zapisati lahko, vendar preveriti, ali se je kaj zapisalo - ne moremo, saj so lastnosti zasebne.
Lahko naredimo getter za te lastnosti ali
preprosto uporabimo magično metodo
__get. Uporabimo drugo možnost:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Magični getter lastnosti:
public function __get($property)
{
return $this->$property;
}
}
?>
Sedaj lahko preverimo delovanje našega razreda. Preverimo:
<?php
$test = new Test;
$test->prop1 = 1; // zapišemo 1
$test->prop2 = 2; // zapišemo 2
echo $test->prop1; // izpiše 1
echo $test->prop2; // izpiše 2
?>
Seveda v resnici ni priporočljivo dovoliti vsem, da pišejo v zasebne lastnosti, sicer izgubi smisel sama pointa teh zasebnih lastnosti (lažje jih je narediti javne in to je to).
Zato je to metodo smiselno uporabljati samo takrat, ko to resnično potrebujemo. V naslednjih lekcijah si bomo ogledali še primere uspešne uporabe.