Уласцівасці толькі для чытання ў ААП у 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.