PHP 8.1: Readonly Attribute

Artikel geschrieben am 30.01.2022 um 23:22 Uhr.

PHP 8.1 hat noch eine weitere Kleinigkeit, die Programmcode eleganter machen wird: readonly-Modifizierung für Klassen.
Es gibt im Alltag viele Situationen in denen Objekte mit Eigenschaften erzeugt werden, die ihren Wert besser in der gesamten Skriptlaufzeit nicht mehr verändern sollten. Natürlich gibt es wie so oft schon heute diverse Umsetzungen um das gewünschte Ergebnis zu erhalten. Dennoch ist es eine nette Erweiterung, die wieder zukünftig unnötigen Programmcode verhindern wird.

Um die neue Möglichkeit zu nutzen, muss der Parameter im Konstruktor bereits aufgeführt sein. Idealerweise mit der, seit PHP 8.0 verfügbaren, Promotion (Beförderung) des Konstruktors-Methode. Kurz gesagt eine Möglichkeit Parameter direkt als Klassen-Eigenschaft zu definieren. Für Einschränkungen und weitere Informationen bitte die offizielle Dokumentation studieren.

class Foo
{
	public function __construct( public readonly string $bar ) { /* [...] */ }
}

Die Variable $bar, die im Konstruktor definiert ist, wird automatisch als öffentliche Klassenvariable angelegt. Man könnte also ganz einfach über $Objekt = new \Foo("Test"); echo $Objekt->bar; darauf zugreifen. Das Setzen der Modifizierung würde (logischerweise) in einem Fehler enden. (Error: Cannot modify readonly property [...])
Natürlich ist eine typische Deklaration ebenfalls möglich, dabei sollten allerdings einige Punkte beachtet werden.

  1. Eine readonly-Modifizierung muss eine Typisierung besitzen. Im Zweifel kann natürlich mixed verwendet werden.
  2. Diese Eigenschaften dürfen keinen Standardwert zugewiesen bekommen, außer im Methoden-Kopf der __construct-Methode.
    Erlaubt: public function __construct( public readonly string $bar = "Initialwert" ) { /* [...] */ }
    Nicht erlaubt: class Foo { public readonly string $bar = "Initialwert"; /* [...] */ }
  3. In der Vererbung muss die readonly-Modifizierung ebenfalls vererbt werden. Das gilt in beide Richtungen! Eine Kindklasse kann zu keinem Zeitpunkt die Modifizierung setzen, wenn die Eltern-Klasse diese Klasseneigenschaft ohne die Modifizierung definiert.