Csak olvasható tulajdonságok az OOP-ban PHP-ben
Vizsgáljunk meg egy osztályt, ahol minden tulajdonság privát:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Most tegyük úgy, hogy ezek a tulajdonságok a külső világban csak olvashatók legyenek. Korábban már csináltunk ilyet, gettereket készítve minden tulajdonsághoz és nem készítve settereket.
Most oldjuk meg ezt a feladatot a
varázsmetódus __get segítségével. Ebben fogjuk visszaadni
a kért tulajdonság értékét. Hogyan
tegyük: a kért tulajdonság neve a
metódus __get paraméterébe kerül,
esetünkben a $property-be.
Ez azt jelenti, hogy elolvashatjuk a tulajdonságot,
amelynek neve egy változóban tárolódik, így:
$this->$property (a tulajdonság neve
változó lesz, vagyis dollárjellel az elején, ezt
átvettük a korábbi leckékben).
Készítsük el az említett __get metódust:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Használjuk fel tulajdonságok olvasására:
<?php
$test = new Test;
echo $test->prop1; // kiírja 1-et
echo $test->prop2; // kiírja 2-t
?>
Ha megpróbálunk valamit beírni a tulajdonságba, az hibához vezet:
<?php
$test = new Test;
$test->prop1 = 2; // hibát jelez
?>
Pontosan erre van szükségünk: a tulajdonság olvasható, de nem írható.
Ha nem létező tulajdonságot próbálunk elolvasni, az hibát jelez:
<?php
$test = new Test;
echo $test->prop3; // hibát jelez
?>
Figyeljünk a következő árnyalatra is: amikor a régi módszerrel készítettük a csak olvasható tulajdonságokat, akkor a tulajdonság olvasásához getter metódust használtunk.
Az új módszerben mi maguk a tulajdonságokhoz fognak hozzáférni, mintha publikusak lennének. De beleírni nem tudunk, mintha privátok lennének.
Legyen adott a következő User osztály, amelynek tulajdonságai
csak olvashatók getterek segítségével:
<?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;
}
}
?>
Alakítsa át az osztály kódját úgy, hogy a getterek helyett
a varázsmetódus __get kerüljön felhasználásra.