Schreibgeschützte Eigenschaften in OOP in PHP
Lassen Sie uns eine Klasse betrachten, in der alle Eigenschaften privat sind:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Lassen Sie uns nun diese Eigenschaften in der Außenwelt nur lesbar machen. Wir haben so etwas bereits früher gemacht, indem wir Getter für jede Eigenschaft erstellt haben und keine Setter erstellt haben.
Lassen Sie uns nun für die Lösung dieser Aufgabe die
magische Methode __get verwenden. Wir werden darin
den Wert der angefragten Eigenschaft zurückgeben. Wie
man das macht: Der Name der angefragten Eigenschaft gelangt
in den Parameter der Methode __get, in unserem Fall
$property.
Das bedeutet, dass wir die Eigenschaft lesen können,
deren Name in der Variable gespeichert ist, wie folgt:
$this->$property (der Name der Eigenschaft wird
eine Variable sein, also mit einem Dollar am Anfang, das
haben wir in vorherigen Lektionen durchgenommen).
Lassen Sie uns die beschriebene Methode __get erstellen:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Verwenden wir sie zum Lesen der Eigenschaften:
<?php
$test = new Test;
echo $test->prop1; // gibt 1 aus
echo $test->prop2; // gibt 2 aus
?>
Der Versuch, etwas in die Eigenschaft zu schreiben, führt zu einem Fehler:
<?php
$test = new Test;
$test->prop1 = 2; // wirft einen Fehler
?>
Das ist genau das, was wir brauchen: Die Eigenschaft kann gelesen, aber nicht geschrieben werden.
Der Versuch, eine nicht existierende Eigenschaft zu lesen, wirft einen Fehler:
<?php
$test = new Test;
echo $test->prop3; // wirft einen Fehler
?>
Achten Sie auch auf die folgende Nuance: Als wir die Eigenschaften schreibgeschützt auf die alte Weise gemacht haben, haben wir, um die Eigenschaft zu lesen, eine Getter-Methode verwendet.
In der neuen Weise werden wir uns direkt an die Eigenschaften wenden, als ob sie öffentlich wären. Aber schreiben können wir in sie nicht, als ob sie privat wären.
Gegeben sei die folgende Klasse User, deren Eigenschaften
nur lesbar mit Hilfe von Gettern zugänglich sind:
<?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;
}
}
?>
Ändern Sie den Code dieser Klasse so, dass anstelle
von Gettern die magische
Methode __get verwendet wird.