PHP statisches Schlüsselwort wird verwendet, um statische Methoden und Attribute zu definieren, die verwendet werden können, um die statische Bindung in Klassen zu verzögern und sie zu ändern Funktionsvariable.
1: Lassen Sie uns zunächst über die Verwendung von Statik in Funktionen sprechen
function add(){ static $a = 0; echo $a,"<br />"; $a++; }
Die Rolle von static ähnelt hier der Rolle von static in C und stellt sicher, dass die Variable $a nur initialisiert wird, wenn add() zum ersten Mal aufgerufen wird, aber das ist der Fall Es ist wichtig zu beachten, dass die Definition Wenn einer statischen Variablen ein Anfangswert zugewiesen wird, ist es nicht erforderlich, einen Anfangswert zuzuweisen. Beim Zuweisen eines Anfangswerts können Sie jedoch keine -Ausdrücke verwenden oder Funktionen aufrufen, um Werte zuzuweisen , andernfalls wird ein Fehler gemeldet.
Außerdem ist zu beachten, dass statische Variablen keine Referenzen speichern, wie folgt:
function get_obj_ref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = &new stdClass(); } return $obj; } $obj = get_obj_ref(); $obj2 = get_obj_ref(); function get_obj_noref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = new stdClass(); } return $obj; } $obj = get_obj_noref(); $obj2 = get_obj_noref();
Wann Beim statischen Speichern von Referenzen wird der Wert der Variablen nach dem zweiten Aufruf der Funktion nicht gespeichert, und beim Ausführen des obigen Programms wird der Fehler „Veraltet“ gemeldet, d verlassen.
2: verzögerte statische Bindung in der Klasse;
verzögerte statische Bindung ermöglicht die Referenzierung der aufgerufenen Klasse im Kontext einer statischen Vererbung . Verzögerte Bindung bedeutet: static:: ist nicht mehr die Klasse, in der die aktuelle Methode definiert ist, sondern die Klasse, in der sie tatsächlich ausgeführt wird. Hinweis: Es kann verwendet werden, um (aber nicht beschränkt auf) statische -Methoden aufzurufen.
Zusätzlich zur einfachen statischen verzögerten Bindungsverwendung gibt es auch einen Weiterleitungsaufruf, d. h. die Verwendung von self::, parent::, static:: und forward_static_call( ) (Diese Funktion kann nur in einer Methode aufgerufen werden) leitet die Anrufinformationen wie folgt weiter:
class A { public static function foo() { static::who(); } public static function who() { echo CLASS."\n"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo CLASS."\n"; } } class C extends B { public static function who() { echo CLASS."\n"; } } C::test();
Das hier erhaltene Ergebnis ist A C C. Offensichtlich wird beim Aufruf von parent::foo() immer noch die Laufzeitaufrufklasse verwendet.
Außerdem ist Folgendes zu beachten: Nur statische Klassen, die explizit deklariert werden, sind untergeordnet und untergeordnet.
Der folgende Teil des Inhalts bezieht sich auf diesen Blog-Beitrag: Klicken Sie hier, um den Link zu öffnen: PHP static inheritance
<span style="font-size:18px;">class A { protected static $var1 = null; protected static $var2 = null; public static function test(){ if(!static::$var2){ static::$var2 = static::$var1; } echo get_called_class().' '.static::$var2.' '; } } class B extends A { protected static $var1 = 'b'; } class C extends A { protected static $var1 = 'c'; } B::test(); C::test(); </span>
Das hier erhaltene Ergebnis ist b b. Hier hat Klasse B zuerst die Methode test() aufgerufen und der Variablen $var2 wurde nach dem Aufruf ein Wert zugewiesen. Klasse C hat jedoch keine eigene Variable $var2 definiert und der Wert der Variable $var2 ist bereits in der übergeordneten Methode vorhanden Klasse, sodass sie direkt verwendet werden kann. Wenn in Klasse B die Variable $var2 explizit definiert ist, ist das Ergebnis unterschiedlich.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung und Vorsichtsmaßnahmen des Schlüsselworts static in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!