Readonly Property in einer Klasse
Februar 2011
Eine Eigenschaft eines Objekts, auf die ein Script von aussen nur Lesezugriff, jedoch kein Schreibzugriff hat, kann in gewissen Fällen durchaus nützlich sein, z.B. wenn eine Veränderung der Variable einen Klassen-internen Fehler auslösen würde. Allerdings gibt es in PHP kein "readonly"-Schlüsselwort.
Es besteht jedoch eine, bzw. mehrere Möglichkeiten, dies zu realisieren:
Möglichkeit #1: Eine Getter-Funktion.
Ausgabe:
Der Lesezugriff über die Funktion get_a() funktioniert problemlos. Beim Versuch, a zu überschreiben, wird allerdings ein Fehler ausgelöst, da eine private Eigenschaft nicht überschrieben werden kann.
Möglichkeit #2: Magische Methode __get().
Ausgabe:
Wie man sieht, kann die Eigenschaft a erfolgreich ausgelesen werden. Da die Eigenschaft a privat ist, kann sie wie in Möglichkeit 1 nicht überschrieben werden.
Die __get()-Methode wird immer dann aufgerufen, wenn eine private oder eine nicht existente Eigenschaft ausgelesen werden soll.
Von innerhalb des Objekts besteht natürlich ein uneingeschränkter Schreibzugriff auf diese readonly Eigenschaften.
Es besteht jedoch eine, bzw. mehrere Möglichkeiten, dies zu realisieren:
Möglichkeit #1: Eine Getter-Funktion.
<?php
class C{
private $a = 42; // readonly Eigenschaft
function get_a(){
return $this->a; // den Wert von 'a' zurück geben
}
}
$c = new C();
// Eigenschaft auslesen
echo $c->get_a();
// Eigenschaft überschreiben
$c->a = 13;
?>
Ausgabe:
42
Fatal error: Cannot access private property C::$a in ~ on line 16
Der Lesezugriff über die Funktion get_a() funktioniert problemlos. Beim Versuch, a zu überschreiben, wird allerdings ein Fehler ausgelöst, da eine private Eigenschaft nicht überschrieben werden kann.
Möglichkeit #2: Magische Methode __get().
<?php
class C{
private $a = 42; // readonly Eigenschaft
function __get($key){
if( $key === 'a' ) return $this->a; // den Wert von 'a' zurück geben, wenn 'a' angefordert
else return null;
}
}
$c = new C();
// Eigenschaft auslesen
echo $c->a;
// Eigenschaft überschreiben
$c->a = 13;
?>
Ausgabe:
42
Fatal error: Cannot access private property C::$a in ~ on line 17
Wie man sieht, kann die Eigenschaft a erfolgreich ausgelesen werden. Da die Eigenschaft a privat ist, kann sie wie in Möglichkeit 1 nicht überschrieben werden.
Die __get()-Methode wird immer dann aufgerufen, wenn eine private oder eine nicht existente Eigenschaft ausgelesen werden soll.
Von innerhalb des Objekts besteht natürlich ein uneingeschränkter Schreibzugriff auf diese readonly Eigenschaften.
