PHP OOP: Statische Methoden verstehen
PHP statische Methoden: Definition, Aufruf, self:: vs static:: (Late Static Binding), Zähler, Factory-Methoden und häufige Fallstricke mit Beispielen.
Eine statische Methode ist eine mit dem Schlüsselwort static deklarierte Methode, die zur Klasse selbst gehört und nicht zu einem einzelnen daraus erstellten Objekt. Da sie an die Klasse gebunden ist, kann sie direkt mit dem Klassennamen und dem Bereichsauflösungsoperator (::) aufgerufen werden — kein new erforderlich.
Dieses Kapitel zeigt, wie statische Methoden definiert und aufgerufen werden, wie sie sich von regulären (Instanz-)Methoden unterscheiden, wie sich self:: und static:: darin verhalten, und in welchen Mustern statische Methoden wirklich hilfreich sind (Hilfsfunktionen, Zähler und Factory-Methoden). Falls Sie noch neu im Umgang mit Klassen sind, lesen Sie zunächst PHP-Klassen und -Objekte.
Was sind statische Methoden in PHP?
Reguläre Methoden arbeiten auf einem bestimmten Objekt und können über $this auf dessen Instanzdaten zugreifen. Eine statische Methode hat kein $this — sie ist an keine Instanz gebunden und kann daher nur mit den übergebenen Argumenten und den eigenen statischen Membern der Klasse arbeiten.
Das macht statische Methoden besonders geeignet für zustandslose Operationen: eine Berechnung, die nur von ihren Eingaben abhängt, nicht vom Zustand eines bestimmten Objekts. Das Berechnen des Durchschnitts einer Zahlenliste ist ein klassisches Beispiel.
class Math
{
public static function average(array $numbers): float
{
return array_sum($numbers) / count($numbers);
}
}Warum statische Methoden verwenden?
| Grund | Was das in der Praxis bedeutet |
|---|---|
| Zustandslosigkeit | Die Ausgabe hängt nur von den Argumenten ab, sodass das Ergebnis vorhersehbar und leicht testbar ist. |
| Keine Instanziierung | new ClassName() entfällt — praktisch für Hilfs- und Hilfsfunktionen. |
| Gemeinsamer Zustand | Statische Methoden können statische Eigenschaften lesen und aktualisieren, sodass eine Klasse Daten über alle ihre Objekte hinweg verfolgen kann (z. B. ein Zähler). |
| Factory-Methoden | Eine statische Methode kann eine konfigurierte Instanz erstellen und zurückgeben, was eine klarere Alternative zu einem komplexen Konstruktor bietet. |
Der Kompromiss: Da statische Methoden nicht über eine normale Objektreferenz überschrieben werden können und keinen Instanzzustand tragen, macht ein übermäßiger Einsatz den Code schwerer testbar und mockbar. Bevorzugen Sie Instanzmethoden, wenn das Verhalten vom Objektzustand abhängt.
Wie man eine statische Methode definiert und aufruft
Fügen Sie static vor dem Methodennamen hinzu und rufen Sie sie dann mit ClassName::method() auf:
<?php
class Math
{
public static function average(array $numbers): float
{
return array_sum($numbers) / count($numbers);
}
}
$average = Math::average([1, 2, 3, 4, 5]);
echo $average; // 3Das Token :: ist der Bereichsauflösungsoperator — derselbe Operator, den Sie für Klassenkonstanten verwenden.
self:: vs static:: und das fehlende $this
Innerhalb einer statischen Methode können Sie $this nicht verwenden, da kein Objekt vorhanden ist, auf das verwiesen werden könnte. Um auf ein anderes statisches Member der Klasse zuzugreifen, verwenden Sie self:: oder static::.
self::löst sich zur Klasse auf, in der die Methode geschrieben ist.static::verwendet Late Static Binding — es löst sich zur Klasse auf, die zur Laufzeit tatsächlich aufgerufen wurde, was bei Vererbung wichtig ist.
<?php
class Base
{
public static function create(): string
{
return self::class; // always "Base"
}
public static function make(): string
{
return static::class; // the called class
}
}
class Child extends Base {}
echo Base::create(), "\n"; // Base
echo Child::create(), "\n"; // Base (self:: is fixed to where it's written)
echo Child::make(), "\n"; // Child (static:: follows the call)Greifen Sie auf static:: zurück, wenn eine Elternklasse Verhalten definiert, das Unterklassen auf sich selbst umleiten können sollen — die Grundlage des Factory-Musters unten. Erfahren Sie mehr in PHP-Vererbung.
Statische Methoden mit statischen Eigenschaften: ein Zähler
Statische Methoden werden häufig mit statischen Eigenschaften kombiniert, um Zustand zu erhalten, der über alle Objekte einer Klasse geteilt wird.
<?php
class User
{
public static int $count = 0;
public function __construct(public string $name)
{
self::$count++;
}
public static function total(): int
{
return self::$count;
}
}
new User('Ada');
new User('Linus');
echo User::total(); // 2Beachten Sie, wie total() self::$count ohne ein Objekt liest — die Eigenschaft lebt auf der Klasse, nicht auf einem einzelnen User.
Factory-Methoden
Eine statische Methode, die eine neue Instanz zurückgibt, wird als Factory-Methode bezeichnet. Sie bietet eine benannte, lesbare Möglichkeit, Objekte zu erstellen:
<?php
class Temperature
{
private function __construct(private float $celsius) {}
public static function fromCelsius(float $c): static
{
return new static($c);
}
public static function fromFahrenheit(float $f): static
{
return new static(($f - 32) * 5 / 9);
}
public function celsius(): float
{
return $this->celsius;
}
}
$t = Temperature::fromFahrenheit(212);
echo $t->celsius(); // 100Die Verwendung von new static() (Late Static Binding) bedeutet, dass eine Unterklasse, die fromCelsius() aufruft, eine Instanz von sich selbst erhält, nicht von Temperature.
Häufige Fallstricke
$thisist nicht verfügbar. Die Verwendung innerhalb einer statischen Methode verursacht einen fatalen Fehler — es gibt kein aktuelles Objekt.- Statische und Instanzmethoden können einen Namen nur klassenübergreifend teilen, nicht in einer Klasse. Innerhalb einer Klasse ist jeder Methodenname eindeutig.
- Sie können eine statische Methode auf einem Objekt aufrufen (
$obj::method()oder sogar$obj->method()), aber sie wird trotzdem ohne$thisausgeführt. Der Aufruf mit$obj->ist zwar erlaubt, aber irreführend — bevorzugen SieClassName::method()für mehr Klarheit. - Statischer Zustand ist global für den Prozess. Ein statischer Zähler wird von jeder Instanz geteilt und bleibt für die gesamte Anfrage bestehen, was in langlebigem oder Test-Code überraschend sein kann.
Fazit
Statische Methoden gehören zur Klasse, laufen ohne eine Instanz und haben keinen Zugriff auf $this. Sie eignen sich hervorragend für zustandslose Hilfsfunktionen, klassenweiten Zustand über statische Eigenschaften und Factory-Methoden, die konfigurierte Objekte erstellen. Verwenden Sie self::, wenn Sie die definierende Klasse meinen, und static::, wenn Unterklassen den Aufruf auf sich selbst umleiten können sollen. Greifen Sie auf statische Methoden zurück, wenn das Verhalten an die Klasse und nicht an ein bestimmtes Objekt gebunden ist — und bevorzugen Sie Instanzmethoden, wenn das nicht der Fall ist.
Vertiefen Sie Ihr Verständnis als Nächstes mit PHP Statische Eigenschaften und PHP-Klassenkonstanten.