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.
<?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->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->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.
 


Andere Einträge