Der Unterschied zwischen new self()
und new static()
in PHP ist subtil, aber entscheidend, besonders im Kontext der Vererbung. Beide Konstrukte dienen zum Erstellen von Objekten, aber sie verhalten sich unterschiedlich in Bezug auf die Klassenhierarchie.
self
bezieht sich immer auf die Klasse, in der es verwendet wird – das bedeutet, es bezieht sich auf die statische Klassenkontext, in der das new
Keyword geschrieben steht. Im Gegensatz dazu bezieht sich static
, auch als „late static binding“ bekannt, auf die Klasse, die tatsächlich die Methode aufruft.
Hier ein Beispiel, um den Unterschied zu verdeutlichen:
class Class_A {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class Class_B extends Class_A {}
echo get_class(Class_B::get_self()); // Gibt "Class_A" aus
echo get_class(Class_B::get_static()); // Gibt "Class_B" aus
echo get_class(Class_A::get_self()); // Gibt "Class_A" aus
echo get_class(Class_A::get_static()); // Gibt "Class_A" aus
In diesem Beispiel zeigt der Aufruf Class_B::get_self()
, dass new self()
immer eine Instanz der Klasse erstellt, in der der Code definiert ist, also Class_A
. new static()
, aufgerufen durch Class_B::get_static()
, hingegen erzeugt eine Instanz von Class_B
, da es die Klasse in Betracht zieht, die die Methode aufruft.
Dies ist besonders nützlich in Fällen von Vererbung, wo du sicherstellen möchtest, dass die Instanziierung zur tatsächlichen aufrufenden Klasse passt, anstatt zur Basisklasse, in der die Methode definiert ist.