bekomme ich die gleichen Ergebnisse?
Nicht wirklich. Ich kenne jedoch keine Problemumgehung für PHP 5.2.
Was ist der Unterschied zwischen new self
und new static
?
self
bezieht sich auf dieselbe Klasse, in der das new
Schlüsselwort tatsächlich geschrieben ist.
static
bezieht sich in den späten statischen Bindungen von PHP 5.3 auf jede Klasse in der Hierarchie, für die Sie die Methode aufgerufen haben.
Erbt im folgenden Beispiel B
beide Methoden von A
. Der self
Aufruf ist gebunden, A
weil er in A
der Implementierung der ersten Methode definiert ist, während er static
an die aufgerufene Klasse gebunden ist (siehe auch get_called_class()
).
class A {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class B extends A {}
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
get_called_class()
, was praktisch dasselbe ist__CLASS__
, aber LSB-kompatibel.self
würden sich selbst zurückgeben undstatic
etwas zurückgeben, das nicht überschrieben werden kann ... Aber siehe da, es ist das Gegenteil. Ich bin immer wieder beeindruckt von der Benennung, den Konventionen und dem allgemeinen Stil von PHP. -_-Wenn die Methode dieses Codes nicht statisch ist, können Sie mithilfe von 5.2 eine Problemumgehung erhalten
get_class($this)
.Die Ergebnisse:
quelle
clone
, sondern nur durch erneutes Erstellen und Festlegen der Eigenschaften.$copy = new static(); $copy->set($this->get()); return $copy;
self::
oderstatic::
Auswirkung Einfluss darauf, ob die Version dieser statischen Methode der Basisklasse oder der Unterklasse verwendet wird. In Ermangelung eines Grundes zu der Annahme, dass eine solche Situation von Natur aus auf eine schlechte Praxis hinweist (und ich sehe keinen Grund, warum dies so sein sollte), ist die Wahl zwischenself::
undstatic::
innerhalb nicht statischer Methoden genauso relevant wie in statische Methoden. Habe ich Ihren Kommentar falsch verstanden oder ist einer von uns einfach falsch?Zusätzlich zu den Antworten anderer:
Das bedeutet, dass Sie
static::
in einer Klasseneigenschaft keine Eigenschaften verwenden können, weil Eigenschaften:Verwenden von
self::
quelle
public $name = static::class;
und nicht in Zeile 7 ausgegeben wird, wie im Beispiel vorgeschlagen. Der Fehler lautet: "static :: class kann nicht für die Auflösung von Klassennamen zur Kompilierungszeit verwendet werden", was darauf hinweist, dass das Problem nicht darin besteht, dass Sie versuchen, auf das Feld $ name zuzugreifen, sondern weit zuvor bei der Kompilierung der PHP-Klasse. Zeile 7 (oder 6) wird im ersten Beispiel nicht erreicht.