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'; // __set методанинг var_dump и '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 ни чиқаради
?>
Албатта, хар кимга хусусий хоссаларга ёзишга рухсат бериш керак эмас, акс ҳолда у хусусий хоссаларнинг мақсади йўқолади (уларни оммавий қилиб қўйиш осонроқ).
Шу сабабли бу метод фақат ҳақиқатдан зарурат бўлгандагина қўлланилиши керак. Кейинги дарсларда биз яна муваффақиятли қўллаш мисолларини кўриб чиқамиз.