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