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; // қате шығарады
?>
Бұз бізге дәл қажет нәрсе: қасиетті оқуға болады, бірақ жазудың жолы жоқ.
Жоқ қасиетті оқу әрекеті қате шығарады:
<?php
$test = new Test;
echo $test->prop3; // қате шығарады
?>
Сондай-ақ келесі нюанске назар аударыңыз: біз қасиеттерді тек оқу үшін ескі әдіспен жасаған кезде, қасиетті оқу үшін біз әдіс-геттерді пайдаландық.
Жаңа әдісте біз дәл қасиеттерге олар жалпыға болатын сияқты жүгінеміз. Бірақ оларға жазудың жолы жоқ, олар жекше сияқты.
Мынадай 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 пайдалану үшін
қайта жасаңыз.