Statische Eigenschaften in PHP OOP verstehen
Statische Eigenschaften in PHP gehören zur Klasse selbst, nicht zu einzelnen Objekten. Alle Instanzen teilen denselben Wert.
Eine statische Eigenschaft gehört zur Klasse selbst und nicht zu einem einzelnen daraus erstellten Objekt. Während eine reguläre (Instanz-)Eigenschaft in jedem Objekt eine eigene Kopie erhält, existiert eine statische Eigenschaft genau einmal und wird von allen Instanzen geteilt — ändert man sie an einer Stelle, sehen alle Instanzen den neuen Wert. Diese Seite erklärt, wie man statische Eigenschaften deklariert, wie man sie liest und schreibt, wie sich self, static und parent unterscheiden, wie sie sich bei Vererbung verhalten und welche Fallstricke es zu beachten gilt.
Wenn Sie neu in PHP-Klassen sind, beginnen Sie zunächst mit PHP Klassen und Objekte.
Was ist eine statische Eigenschaft?
Eine statische Eigenschaft wird mit dem Schlüsselwort static in Kombination mit einem Sichtbarkeitsmodifikator (public, protected oder private) deklariert:
<?php
class User {
public static int $count = 0;
public function __construct() {
self::$count++;
}
}
new User();
new User();
new User();
echo User::$count; // 3Drei Dinge unterscheiden eine statische Eigenschaft von einer gewöhnlichen:
- Zugriff über die Klasse, nicht über ein Objekt. Man schreibt
User::$countmit dem Bereichsauflösungsoperator::, nicht$user->count. Der Zugriff auf eine statische Eigenschaft über den Pfeiloperator ($user->count) funktioniert nicht und erzeugt einen Hinweis. - Geteilt, nicht kopiert. Jedes
new User()inkrementiert dasselbe$count. Es gibt nur eine Kopie im Speicher für die gesamte Klasse. - Innerhalb der Klasse als
self::$countreferenziert. Innerhalb einer Methode erreicht man die Eigenschaft überself::,static::oderparent::— niemals mit$this.
Lesen und Schreiben einer statischen Eigenschaft
Von innerhalb der Klasse verwendet man self::$property. Von außen verwendet man ClassName::$property. Da es nur eine Kopie gibt, ist ein Schreibzugriff aus beliebigem Kontext überall sichtbar:
<?php
class Counter {
public static int $value = 0;
public static function increment(): void {
self::$value++;
}
}
Counter::increment();
Counter::increment();
Counter::$value += 10; // also writable directly from outside
echo Counter::$value; // 12Eine statische Eigenschaft kann einen Standardwert haben, aber dieser Standardwert muss ein konstanter Ausdruck sein (ein Literal, eine Konstante oder ein einfacher arithmetischer const-Ausdruck) — er darf nicht das Ergebnis eines Funktionsaufrufs oder eines new-Objekts sein.
self:: vs. static:: (Late Static Binding)
Innerhalb einer Methode kann man eine statische Eigenschaft entweder mit self:: oder static:: erreichen. Sie unterscheiden sich, wenn Vererbung im Spiel ist:
self::wird zur Kompilierzeit aufgelöst und zeigt immer auf die Klasse, in der der Code geschrieben wurde.static::verwendet Late Static Binding — es zeigt auf die Klasse, auf der die Methode zur Laufzeit aufgerufen wurde.
<?php
class Base {
public static string $label = "Base";
public static function whoAmISelf(): string {
return self::$label; // bound to Base
}
public static function whoAmIStatic(): string {
return static::$label; // bound to the calling class
}
}
class Child extends Base {
public static string $label = "Child";
}
echo Child::whoAmISelf(); // Base
echo "\n";
echo Child::whoAmIStatic(); // ChildVerwenden Sie static::, wenn Unterklassen den Wert überschreiben sollen; verwenden Sie self::, wenn der Wert an die deklarierenden Klasse gebunden bleiben soll. Weitere Informationen zum Aufrufen statischer Member finden Sie unter PHP Statische Methoden.
Wann sollte man statische Eigenschaften verwenden?
Statische Eigenschaften glänzen immer dann, wenn ein Zustand über alle Instanzen einer Klasse hinweg geteilt werden muss:
- Instanzen zählen — das obige
User::$count-Beispiel verfolgt, wie viele Objekte existieren. - Caching / Registries — eine Nachschlagetabelle oder eine einzelne gemeinsam genutzte Ressource (z. B. ein Datenbankverbindungs-Handle) speichern, damit sie einmal erstellt und wiederverwendet wird.
- Konfiguration oder Flags — ein Standard, der für die gesamte Klasse gilt, wie z. B. ein globales
User::$defaultRole. - Das Singleton-Muster — eine private statische Eigenschaft enthält die einzelne Instanz, die von
getInstance()zurückgegeben wird.
Wenn sich der Wert nach der Deklaration nie ändern soll, bevorzugen Sie stattdessen eine Klassenkonstante (const) — sie drückt die Absicht besser aus und kann nicht neu zugewiesen werden.
Häufige Fallstricke
- Statische Eigenschaften sind keine Konstanten. Sie sind veränderlich; jeder Code mit Zugriff kann sie neu zuweisen. Verwenden Sie
constfür Werte, die sich nicht ändern dürfen. - Gemeinsamer Zustand ist ein zweischneidiges Schwert. Da alle Instanzen denselben Wert teilen, taucht eine Änderung in einem Objekt überall auf — praktisch für Zähler, gefährlich, wenn man pro-Objekt-Daten erwartet hat.
- Kein
$thisin einem statischen Kontext. Statische Methoden haben kein$this, daher muss eine statische Eigenschaft mitself::,static::oderparent::erreicht werden. - Vererbung teilt den Speicher des Elternteils, sofern nicht neu deklariert. Eine Unterklasse, die eine statische Eigenschaft nicht neu deklariert, teilt die einzelne Kopie des Elternteils; eine Neudeklaration (wie
Childoben) gibt der Unterklasse ihre eigene.
Fazit
Statische Eigenschaften ermöglichen es einer Klasse, Zustand zu halten, der von allen ihren Instanzen geteilt wird, auf den über den Klassenname mit dem Operator :: und innerhalb der Klasse über self::/static:: zugegriffen wird. Sie sind ideal für Zähler, Caches, Registries und Singletons. Greifen Sie auf eine Klassen-const zurück, wenn der Wert unveränderlich bleiben muss, und bedenken Sie, dass static:: Late Static Binding ermöglicht, sodass Unterklassen den Wert überschreiben können. Erkunden Sie als Nächstes PHP Statische Methoden und PHP Vererbung, um zu sehen, wie diese Teile zusammenpassen.