Snimanje svojstava kroz magiju u OOP u PHP
Magična metoda __set se poziva
prilikom pokušaja promene vrednosti nepostojećeg
ili skrivenog svojstva. Kao parametre
prihvata ime svojstva i vrednost koju
mužemo pokušavamo da mu dodelimo.
Pogledajmo na praktičnom primeru.
Neka nam je dat ovakva klasa Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Hajde da napravimo u ovoj klasi magičnu
metodu __set, koja će pomoću funkcije
var_dump ispisivati ime svojstva,
na koje je došlo pozivanje, i vrednost,
koju tom svojstvu pokušavamo da postavimo:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Proverimo rad naše klase:
<?php
$test = new Test;
$test->prop = 'vrednost'; // var_dump metode __set će ispisati 'prop vrednost'
?>
Hajde sada da postavljamo vrednost
svojstvu čije je ime sačuvano u promenljivoj
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // postavljamo vrednost
}
}
?>
Sada ćemo moći da upisujemo u privatna svojstva spolja iz klase:
<?php
$test = new Test;
$test->prop1 = 1; // upisaćemo 1
$test->prop2 = 2; // upisaćemo 2
?>
Upisivati možemo, međutim, proveriti da li je nešto upisano tamo - ne možemo, jer su svojstva privatna.
Možemo napraviti geter za ova svojstva ili
jednostavno iskoristiti magičnu metodu
__get. Iskoristićemo drugu opciju:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Magični geter svojstava:
public function __get($property)
{
return $this->$property;
}
}
?>
E sad možemo da proverimo rad naše klase. Proverimo:
<?php
$test = new Test;
$test->prop1 = 1; // upisaćemo 1
$test->prop2 = 2; // upisaćemo 2
echo $test->prop1; // ispisaće 1
echo $test->prop2; // ispisaće 2
?>
Zapravo, naravno, ne treba dozvoljavati svakome da upisuje u privatna svojstva, inače nestaje suština tih privatnih svojstava (lakše je učiniti ih javnim i to je sve).
Stoga ovu metodu treba primenjivati samo kada zaista postoji potreba. U narednim lekcijama ćemo još razmotriti primere uspešne primene.