Read-only Properties in OOP in PHP
Hajde da razmotrimo klas u kome su sva svojstva privatna:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Sada učinimo da ova svojstva u spoljašnjem svetu budu dostupna samo za čitanje. Ranije smo već to radili, kreirajući getere za svako svojstvo i ne kreirajući setere.
Hajde sada da za rešavanje ovog zadatka iskoristimo
magičnu metodu __get. Vraćaćemo
u njoj vrednost traženog svojstva. Kako
to uraditi: ime traženog svojstva dolazi
u parametar metode __get, u našem slučaju
$property.
To znači da možemo pročitati svojstvo,
čije ime se čuva u promenljivoj, ovako:
$this->$property (ime svojstva će biti
promenljivo, odnosno sa dolarom na početku, mi
smo to prošli u prethodnim lekcijama).
Hajde da napravimo opisanu metodu __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Iskoristimo je za čitanje svojstava:
<?php
$test = new Test;
echo $test->prop1; // ispisaće 1
echo $test->prop2; // ispisaće 2
?>
Pokušaj da se nešto upiše u svojstvo dovest će do greške:
<?php
$test = new Test;
$test->prop1 = 2; // ispisaće grešku
?>
To je upravo ono što nam je potrebno: svojstvo se može čitati, ali se ne može upisivati.
Pokušaj čitanja nepostojećeg svojstva ispisaće grešku:
<?php
$test = new Test;
echo $test->prop3; // ispisaće grešku
?>
Obratite takođe pažnju na sledeću nijansu: kada smo pravili svojstva samo za čitanje starim načinom, onda smo da bismo pročitali svojstvo, koristili metodu-geter.
U novom načinu mi ćemo se obraćati upravo svojstvima, kao da su javna. Ali upisati u njih nećemo moći, kao da su privatna.
Neka je dat evo takav klas User, čija svojstva
su dostupna samo za čitanje uz pomoć
getera:
<?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;
}
}
?>
Preoblikujte kod ovog klasa tako da umesto
getera bude korišćena magična
metoda __get.