Својства само за читање у ООП у 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.