Писање својстава кроз магију у ООП у PHP
Магични метод __set позива се
при покушају промене вредности непостојећег
или скривеног својства. Као параметре
прима име својства и вредност, коју
му покушавају доделити.
Погледајмо на практичном примеру.
Нека нам је дат овакав класс Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Направимо у овом класу магични
метод __set, који ће уз помоћ функције
var_dump исписивати име својства,
коме се дошло до приступа, и вредност,
коју том својству покушавају поставити:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Проверимо рад нашег класа:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump метода __set исписаће 'prop value'
?>
Хајде сада да постављамо вредност
својству, чије се име чува у променљивој
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // постављамо вредност
}
}
?>
Сада можемо да уписујемо у приватна својства споља класа:
<?php
$test = new Test;
$test->prop1 = 1; // уписаћемо 1
$test->prop2 = 2; // уписаћемо 2
?>
Упис можемо, међутим, проверити, да ли се тамо нешто уписало - не, јер су својства приватна.
Може се направити гетер за та својства или
једноставно искористити магични метод
__get. Искористимо другу опцију:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Магични гетер својстава:
public function __get($property)
{
return $this->$property;
}
}
?>
Е сада можемо да проверимо рад нашег класа. Проверимо:
<?php
$test = new Test;
$test->prop1 = 1; // уписаћемо 1
$test->prop2 = 2; // уписаћемо 2
echo $test->prop1; // исписаће 1
echo $test->prop2; // исписаће 2
?>
У ствари, наравно, не треба дозвољавати свима да уписују у приватна својства, иначе нестаје поента тих приватних својстава (једноставније је да се направе јавним и то је то).
Зато овај метод треба примењивати само онда када за то заиста постоји потреба. У следећим лекцијама ћемо још размотрити примере успешне примене.