New self vs. new static: Der Schlüssel zu flexiblem PHP-Code 2025

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Ein kleiner Buchstabe, der alles verändert

\n\n

Stellen Sie sich vor: Sie entwickeln ein cooles PHP-Framework oder einfach eine Bibliothek für Ihr Projekt. Alles läuft perfekt, aber einen Monat später stellen Sie fest, dass sich die Kindklassen nicht so verhalten, wie Sie es erwartet haben. Sie erstellen ein Objekt, und es gibt – zack! – eine Instanz der Elternklasse zurück. Kommt Ihnen bekannt vor? Willkommen im Club derer, die auf new self vs. new static gestoßen sind.

\n\n

Diese Frage auf Stack Overflow hat tausende Aufrufe, und das zu Recht. Der Unterschied zwischen self und static in PHP ist nicht nur syntaktischer Zucker, sondern ein grundlegender Mechanismus, der Ihr Projekt retten oder in einen Wartungsalbtraum verwandeln kann. Im Jahr 2025, während PHP sich weiterentwickelt, ist das Verständnis von Late Static Binding eine Pflichtfähigkeit für jeden ernstzunehmenden Entwickler.

\n\n

In diesem Artikel wiederholen wir nicht einfach die Dokumentation. Wir analysieren reale Anwendungsfälle, zeigen Anti-Patterns und geben klare Best Practices, die Sie noch heute anwenden können. Los geht's!

\n\n

Hauptteil: self vs. static – Der Kampf um den Kontext

\n\n

1. self – Der konservative Compiler-Freund

\n\n

Das Schlüsselwort self in PHP bezieht sich immer auf die Klasse, in der es geschrieben wurde. Denken Sie daran wie an einen alten, treuen Freund, der sich nie ändert. Wenn Sie new self() in einer Elternklasse schreiben, erstellt dieser Code immer ein Objekt genau dieser Elternklasse – selbst wenn er von einer Kindklasse aufgerufen wird.

\n\n
<?php\nclass Animal {\n    public static function create() {\n        return new self(); // Immer Animal\n    }\n}\n\nclass Dog extends Animal {\n    // Erbt create()\n}\n\n$dog = Dog::create();\necho get_class($dog); // Gibt aus: Animal\n?>
\n\n

Sehen Sie? Wir haben die Methode der Klasse Dog aufgerufen, aber ein Animal erhalten. Das ist oft eine Überraschung für Anfänger. Wo liegt der Haken? self wird bereits zur Kompilierzeit aufgelöst. PHP "versiegelt" den Verweis auf die Klasse, in der die Methode deklariert ist, und keine Vererbungsmagie kann das ändern.

\n\n

2. static – Der revolutionäre Late Binder

\n\n

static ist das genaue Gegenteil. Es wird zum Zeitpunkt des Methodenaufrufs ausgewertet und bestimmt, welche Klasse die Methode aufgerufen hat. Das ist das Late Static Binding, das seit PHP 5.3.0 existiert.

\n\n
<?php\nclass Animal {\n    public static function create() {\n        return new static(); // Erstellt eine Instanz der Klasse, die die Methode aufgerufen hat\n    }\n}\n\nclass Dog extends Animal {\n    // Erbt create()\n}\n\n$dog = Dog::create();\necho get_class($dog); // Gibt aus: Dog\n?>
\n\n

Was für eine Wendung! Jetzt gibt Dog::create() einen Hund zurück, kein abstraktes Tier. static schaut, wer die Methode aufgerufen hat, und erstellt ein Objekt genau dieser Klasse. Das bietet eine unglaubliche Flexibilität beim Aufbau von Klassenhierarchien.

\n\n

3. Wann self, wann static verwenden?

\n\n

Die goldene Regel: Verwenden Sie self, wenn Sie eine feste Bindung an die aktuelle Klasse benötigen, und static, wenn Kindklassen das Verhalten überschreiben können sollen.

\n\n

Hier sind einige konkrete Szenarien:

\n\n

Szenario A: Factory-Methoden (Verwenden Sie static)

\n

Ein klassisches Beispiel ist das Factory Method-Entwurfsmuster. Sie möchten, dass jede Kindklasse sich selbst erstellt.

\n\n
<?php\nabstract class Vehicle {\n    abstract public function getType(): string;\n\n    public static function create(): static {\n        return new static();\n    }\n}\n\nclass Car extends Vehicle {\n    public function getType(): string {\n        return 'Auto';\n    }\n}\n\nclass Bike extends Vehicle {\n    public function getType(): string {\n        return 'Fahrrad';\n    }\n}                

Blogs

Buchempfehlungen