Vlastnosti len na čítanie v OOP v PHP
Pozrime sa na triedu, v ktorej sú všetky vlastnosti súkromné:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Teraz urobme tak, aby tieto vlastnosti boli v externe dostupné len na čítanie. Podobné sme už robili, keď sme vytvárali gettre pre každú vlastnosť a nevytvárali settre.
Poďme teraz na vyriešenie tejto úlohy použiť
magickú metódu __get. Budeme v nej vracať
hodnotu požadovanej vlastnosti. Ako
to urobiť: názov požadovanej vlastnosti sa dostane
do parametra metódy __get, v našom prípade
$property.
To znamená, že môžeme prečítať vlastnosť,
ktorej názov je uložený v premennej, takto:
$this->$property (názov vlastnosti bude
premenná, teda s dolárom na začiatku, to
sme preberali v predchádzajúcich lekciách).
Urobme opísanú metódu __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Využime ju na čítanie vlastností:
<?php
$test = new Test;
echo $test->prop1; // vypíše 1
echo $test->prop2; // vypíše 2
?>
Pokus o zápis čohokoľvek do vlastnosti povedie k chybe:
<?php
$test = new Test;
$test->prop1 = 2; // vyvolá chybu
?>
Je to presne to, čo potrebujeme: vlastnosť možno prečítať, ale nie zapisovať.
Pokus o prečítanie neexistujúcej vlastnosti vyvolá chybu:
<?php
$test = new Test;
echo $test->prop3; // vyvolá chybu
?>
Všimnite si tiež nasledujúcu nuansu: keď sme robili vlastnosti len na čítanie starým spôsobom, tak na to, aby sme prečítali vlastnosť, sme používali metódu-getter.
V novom spôsob budeme pristupovať priamo k vlastnostiam, akoby boli verejné. Ale zapísať do nich nebudeme môcť, akoby boli súkromné.
Nech je daná takáto trieda User, ktorej vlastnosti
sú dostupné len na čítanie pomocou
getterov:
<?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;
}
}
?>
Upravte kód tejto triedy tak, aby namiesto
getterov bol použitý magický
metód __get.