Wenn Sie selfauf ein Klassenmitglied verweisen, beziehen Sie sich auf die Klasse, in der Sie das Schlüsselwort verwenden. In diesem Fall Foodefiniert Ihre Klasse eine geschützte statische Eigenschaft namens $bar. Wenn Sie selfin der FooKlasse auf die Eigenschaft verweisen, verweisen Sie auf dieselbe Klasse.
Wenn Sie also versuchen, eine andere Klasse self::$barin Ihrer FooKlasse zu verwenden, aber eine BarKlasse mit einem anderen Wert für die Eigenschaft haben, wird diese Foo::$baranstelle von verwendet Bar::$bar, was möglicherweise nicht das ist, was Sie beabsichtigen:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Wenn Sie eine Methode über aufrufen , rufenstatic Sie eine Funktion auf, die als späte statische Bindungen bezeichnet wird (eingeführt in PHP 5.3).
Im obigen Szenario führt die Verwendung selfzu Foo::$bar(1234). Und using staticführt zu Bar::$bar(4321), da mit staticmit der Interpreter die Neudeklaration innerhalb der BarKlasse zur Laufzeit berücksichtigt wird .
Normalerweise verwenden Sie späte statische Bindungen für Methoden oder sogar die Klasse selbst anstelle von Eigenschaften, da Sie Eigenschaften in Unterklassen nicht häufig neu deklarieren. Ein Beispiel für die Verwendung des staticSchlüsselworts zum Aufrufen eines spät gebundenen Konstruktors finden Sie in dieser verwandten Frage: New self vs. new static
Dies schließt jedoch auch die Verwendung staticmit Eigenschaften nicht aus .