Alleen-lezen eigenschappen in OOP in PHP
Laten we een klasse bekijken waarin alle eigenschappen privé zijn:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Laten we nu deze eigenschappen alleen-lezen maken in de externe wereld. We hebben dit eerder gedaan door getters te maken voor elke eigenschap en geen setters te maken.
Laten we nu voor deze taak gebruik maken van
de magische methode __get. We zullen
hierin de waarde van de opgevraagde eigenschap teruggeven.
Hoe dit te doen: de naam van de opgevraagde eigenschap komt
in de parameter van de methode __get, in ons geval
$property.
Dit betekent dat we de eigenschap kunnen lezen,
waarvan de naam in een variabele is opgeslagen, zo:
$this->$property (de naam van de eigenschap zal
een variabele zijn, dus met een dollarteken aan het begin, we
hebben dit in eerdere lessen behandeld).
Laten we de beschreven methode __get maken:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Laten we hem gebruiken om eigenschappen te lezen:
<?php
$test = new Test;
echo $test->prop1; // geeft 1 weer
echo $test->prop2; // geeft 2 weer
?>
Een poging om iets in de eigenschap te schrijven leidt tot een fout:
<?php
$test = new Test;
$test->prop1 = 2; // geeft een foutmelding
?>
Dit is precies wat we nodig hebben: de eigenschap kan worden gelezen, maar niet worden beschreven.
Een poging om een niet-bestaande eigenschap te lezen geeft een foutmelding:
<?php
$test = new Test;
echo $test->prop3; // geeft een foutmelding
?>
Let ook op het volgende nuance: toen we eigenschappen alleen-lezen maakten op de oude manier, gebruikten we om de eigenschap te lezen een getter-methode.
In de nieuwe manier zullen we ons rechtstreeks tot de eigenschappen wenden, alsof ze publiek zijn. Maar we kunnen er niet in schrijven, alsof ze privé zijn.
Stel we hebben de volgende klasse User, waarvan de eigenschappen
alleen-lezen zijn met behulp van
getters:
<?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;
}
}
?>
Herschrijf de code van deze klasse zodat in plaats
van getters de magische
methode __get wordt gebruikt.