Eine static-Methode oder -Eigenschaft gehört zur Klasse selbst statt zu einem Objekt. Eine statische Methode rufst du mit ClassName::method() auf, und eine statische Eigenschaft liest du mit ClassName::$property, ohne vorher ein Objekt zu erzeugen. In der Klasse verweist self:: auf dieselben Member.
Nirgendwo steht new Temperature(). Statische Member sind nützlich für Helfer, die keinen Objektzustand brauchen (Umrechnungen, Factories, Validierung), und für Daten, die zur Klasse als Ganzes gehören, etwa einen Zähler.
Statische Eigenschaften teilen sich alle Objekte
Eine normale Eigenschaft hat einen Wert pro Objekt. Eine statische Eigenschaft hat einen Wert für die ganze Klasse, also sieht jedes Objekt denselben. Hier erhöht jeder neue User einen gemeinsamen Zähler und bekommt die nächste ID:
Beachte das $ in self::$nextId: Statische Eigenschaften behalten es nach ::, Konstanten (self::MAX) nicht. Eine statische Eigenschaft lebt nur für eine PHP-Anfrage. Auf einer typischen Website (PHP-FPM oder Apache) beginnt sie bei jedem Seitenaufruf von vorn, ist also kein Ort, um Daten zwischen Besuchern zu speichern.
Statische Methoden haben kein $this
Eine statische Methode läuft ohne Objekt, also existiert $this darin nicht. Eine statische Methode kann andere statische Methoden mit self:: aufrufen, aber keine normalen Eigenschaften lesen. Eine normale Methode statisch aufzurufen scheitert ebenfalls:
Die umgekehrte Richtung ist kein Problem: Eine normale Methode kann statische aufrufen, wie es withSeparator() mit self::make() tut.
self vs static: Late Static Binding
self:: zeigt auf die Klasse, in der der Code steht. static:: zeigt auf die Klasse, auf der die Methode zur Laufzeit aufgerufen wurde. Der Unterschied zeigt sich nur bei Vererbung, und er zählt am meisten bei Factory-Methoden:
Post::createWithSelf() liefert ein Model, und das wollte der Aufrufer fast nie. static löst sich zu Post auf, weil das die im Aufruf genannte Klasse ist; PHP nennt das Late Static Binding. Verwende static:: und new static() in Methoden, die vererbt werden sollen, und self::, wenn du wirklich genau diese Klasse meinst. Dieselbe Regel gilt für Konstanten: static::TABLE nimmt das eigene TABLE eines Kindes, während self::TABLE immer das der Klasse liest, in der der Code steht.
Geerbte statische Eigenschaften werden geteilt
Eine Kindklasse teilt sich die statische Eigenschaft ihrer Elternklasse, außer sie deklariert eine eigene. Das ist die klassische static-Überraschung: zwei Unterklassen, die in eine einzige Zahl zählen.
Apples hat kein eigenes $count, also ist Apples::$count dasselbe wie Counter::$count, und beide geben 2 aus. Pears deklariert die Eigenschaft neu und zählt für sich. Eine statische Eigenschaft, die in einem Trait deklariert ist, verhält sich anders: Jede Klasse, die den Trait verwendet, bekommt eine eigene Kopie.
Statische Variablen in Funktionen
static hat in einem Funktionsrumpf eine zweite Bedeutung: Eine statische Variable behält ihren Wert zwischen Aufrufen. Der Startwert wird nur beim ersten Aufruf der Funktion zugewiesen:
Das zweite slowSquare(12) überspringt die Berechnung. Wie statische Eigenschaften beginnen diese Werte am Ende jeder Anfrage von vorn. Die Seite zu Variablen behandelt den Scope von Variablen allgemein.
Wann static die falsche Wahl ist
Statische Methoden sind bequem, und genau deshalb werden sie leicht übertrieben. Eine Klasse, deren Methoden alle statische Eigenschaften lesen und schreiben, ist globaler Zustand mit einem Klassennamen darauf: Jeder Aufrufer teilt ihn, Tests bekommen keine frische Kopie, und du kannst keine andere Implementierung einsetzen.
Gute Einsätze für static: reine Helfer ohne Zustand (Slug::make()), benannte Konstruktoren (Color::fromHex()) und klassenweite Konstanten. Wenn eine Methode Daten braucht, die sich zwischen zwei Verwendungen unterscheiden könnten, will sie ein Objekt.
Häufig gestellte Fragen
Wie rufe ich in PHP eine statische Methode auf?
Mit dem Klassennamen und ::: MathHelper::square(4). In derselben Klasse verwendest du self::square(4) oder static::square(4). Ein Objekt ist nicht nötig, und in einer statischen Methode gibt es kein $this.
Was ist der Unterschied zwischen self und static in PHP?
self:: bedeutet immer die Klasse, in der der Code steht. static:: bedeutet die Klasse, auf der die Methode tatsächlich aufgerufen wurde, und das kann eine Kindklasse sein; das nennt man Late Static Binding. In einer Methode create() der Elternklasse baut new self() also immer die Elternklasse, während new static() das Kind baut, das sie aufgerufen hat.
Was ist eine statische Eigenschaft in PHP?
Eine als public static int $count = 0; deklarierte Eigenschaft gehört zur Klasse, also gibt es einen einzigen Wert, den sich jedes Objekt dieser Klasse teilt (und ihre Kinder, außer ein Kind deklariert sie neu). Du liest und schreibst sie mit ClassName::$count oder self::$count; beachte das $.
Kann ich in PHP eine statische Methode auf einem Objekt aufrufen?
Ja. $obj->square(4) und $obj::square(4) rufen beide die statische Methode der Klasse des Objekts auf, aber darin gibt es trotzdem kein $this. Die Richtung, die scheitert, ist eine nicht statische Methode als ClassName::method() aufzurufen: Seit PHP 8 wirft das einen Error.
Kann ich $this in einer statischen Methode verwenden?
Nein. Eine statische Methode läuft ohne Objekt, also ist $this dort nicht definiert, und es zu verwenden wirft einen Error („Using $this when not in object context“). Verwende self:: oder static::, um andere statische Member zu erreichen.