PHP да ООПда факат ўқиш учун хос хусусиятлар
Келтирилган барча хусусиятлари приват бўлган синфни кўриб чиқайлик:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Энди бу хусусиятлар ташқари дунёда факат ўқиш учун мавжуд бўлишини таъминлайлик. Биз буни илгари ҳар бир хусусият учун геттерлар яратиб, сеттерларни яратмасдан амалга оширганмиз.
Энди бу вазифани ҳал этиш учун магик
усул __get дан фойдаланайлик. Унда
сўралган хусусиятнинг қийматини қайтарамиз. Буни
қандай амалга ошириш мумкин: сўралган хусусиятнинг
номи __get усулининг параметрига тўшади,
бизнинг ҳолимизда $property.
Демак, биз ўзгарувчида сақланган номли
хусусиятни ўқишимиз мумкин, мана бу ёндай:
$this->$property (хусусиятнинг номи
ўзгарувчи бўлади, яъни бошланиши доллар билан, биз
буни олдинги дарсларда ўтганмиз).
Келтирилган __get усулини яратайлик:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Уни хусусиятларни ўқиш учун қўллаймиз:
<?php
$test = new Test;
echo $test->prop1; // 1 ни чиқаради
echo $test->prop2; // 2 ни чиқаради
?>
Хусусиятга бирор нарса ёзиш уриниши хатоликка олиб келади:
<?php
$test = new Test;
$test->prop1 = 2; // хатолик берadi
?>
Бу айнан бизга керак бўлган нарса: хусусиятни ўқиш мумкин, лекин унга ёзиш мумкин эмас.
Мавжуд бўлмаган хусусиятни ўқиш уриниши хатолик беради:
<?php
$test = new Test;
echo $test->prop3; // хатолик берadi
?>
Шунингдек, куйидаги нюансга эътибор беринг: биз хусусиятларни факат ўқиш учун эски усул билан ясаганда, хусусиятни ўқиш учун биз геттер-усулдан фойдаланганмиз.
Янги усулда биз айнан хусусиятларга, гўёки улар оммавий бўлганидек, мурожаат қиламиз. Лекин уларга ёза олмаймиз, гўёки улар приват.
User синфи берилган бўлиб, унинг хусусиятлари
геттерлар ёрдамида факат ўқиш учун мавжуд:
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Бу синфнинг кодини геттерлар ўрнига магик
усул __get ишлатиладиган қилиб ўзгартиринг.