Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung der verzögerten statischen Bindung in PHP

Detaillierte Erläuterung der Verwendung der verzögerten statischen Bindung in PHP

php中世界最好的语言
php中世界最好的语言Original
2018-05-17 11:47:301814Durchsuche

Dieses Mal werde ich Ihnen die Verwendung der verzögerten statischen PHP-Bindung ausführlich erläutern. Was sind die Vorsichtsmaßnahmen für die Verwendung der verzögerten statischen PHP-Bindung? Hier ist ein praktischer Fall.

Die sogenannte verzögerte statische Bindung, wie der Name schon sagt, wenn statisch aufruft, wird die Bindung des Teils auf der linken Seite des ::-Symbols verzögert, was bedeutet, dass es wird nicht mehr als der Ort geparst, an dem die aktuelle Methode definiert ist, sondern wird zur tatsächlichen Laufzeit berechnet. In diesem Artikel werden hauptsächlich die relevanten Inhalte zur verzögerten statischen Bindung von PHP vorgestellt. Im Folgenden werde ich nicht viel sagen. Werfen wir einen Blick auf die detaillierte Einführung.

Ich rieche etwas Schlechtes

Ich habe mir in dieser Zeit den PHP-Code im Hintergrund des Projekts angesehen und ein Stück Code gesehen Ähnlich wie das Folgende. Es kommt heraus:

<?php
 class DBHandler {
  function get() {}
 }
 class MySQLHandler extends DBHandler {
  // 这里一个create
  public static function create() {
   echo "MySQL";
   return new self();
  }
  public function get() {
   echo "MySQL get()";
  }
 }
 class MemcachedHandler extends DBHandler {
  // 这里又有一个create
  public static function create() {
   echo "Memcached";
   return new self();
  }
  public function get() {
   echo "Memcached get";
  }
 }
 function get(DBHandler $handler) {
  $handler->get();
 }
 $dbHandler = MySQLHandler::create();
 get($dbHandler);
?>

Riechst du schlechten Code? Wie Sie sehen können, gibt es eine Erstellungsfunktion in den Klassen MySQLHandler und MemcachedHandler. Nachdem ich meine Ausgabeanweisungen entfernt hatte, stellte ich fest, dass sie genau gleich sind. Ja, Code-Refactoring ist erforderlich.

Einfaches Refactoring durchführen

Code-Refactoring ist überall, solange Sie darüber nachdenken und das Gefühl haben, dass es Verbesserungen gibt, müssen Sie es tun Starten Sie es. Die Tastatur beginnt zu funktionieren. Kommen Sie, überarbeiten Sie den obigen Code wie folgt:

<?php
 class DBHandler {
  public static function create() {
   echo "create";
   return new self();
  }
  function get() {}
 }
 class MySQLHandler extends DBHandler {
  public function get() {
   echo "MySQL get()";
  }
 }
 class MemcachedHandler extends DBHandler {
  public function get() {
   echo "Memcached get";
  }
 }
 function get(DBHandler $handler) {
  $handler->get();
 }
 $dbHandler = MySQLHandler::create();
 get($dbHandler);
?>

Verschieben Sie die Erstellungsfunktion in die DBHandler-Klasse. Es sieht gut aus, mindestens ein Teil des fehlerhaften Codes wurde entfernt.

scheint falsch zu sein

Führen Sie es aus, aber Sie stellen fest, dass das von uns erwartete MySQL get()  nicht gedruckt wird. Was ist los? Dies zeigt, dass die Get-Funktion von MySQLHandler nicht aufgerufen wird, aber der Code ruft sie eindeutig auf. Dies zeigt, dass ein Problem mit dem Code new self() vorliegt. Was ist daran falsch? Dies bringt uns zum Schwerpunkt der heutigen Zusammenfassung – der verzögerten statischen Bindung.

Verzögerte statische Bindung

Verzögerte statische Bindung wurde nach PHP5.3 eingeführt. Schauen Sie sich den folgenden Code noch einmal an:

<?php
 class A {
  public static function who() {
   echo CLASS;
  }
  public static function test() {
   self::who();
  }
 }
 class B extends A {
  public static function who() {
   echo CLASS;
  }
 }
 B::test();
?>

Der obige Code gibt A aus, aber ich möchte, dass er B ausgibt. Das ist das Problem. Dies ist auch eine Einschränkung des Selbst und der Klasse. Ein statischer Verweis auf die aktuelle Klasse mit self:: oder CLASS, abhängig von der Klasse, in der die aktuelle Methode definiert ist. Das erklärt also sehr gut, warum der obige Code A ausgibt. Aber was ist, wenn wir B ausgeben müssen? Sie können Folgendes tun:

<?php
 class A {
  public static function who() {
   echo CLASS;
  }
  public static function test() {
   static::who(); // 这里有变化,后期静态绑定从这里开始
  }
 }
 class B extends A {
  public static function who() {
   echo CLASS;
  }
 }
 B::test();
?>

Die späte statische Bindung soll die Einschränkung umgehen, indem ein neues Schlüsselwort eingeführt wird, um die Klasse darzustellen, die ursprünglich zur Laufzeit aufgerufen wird. Einfach ausgedrückt ermöglicht Ihnen dieses Schlüsselwort, beim Aufruf von test() im obigen Beispiel auf Klasse B statt auf Klasse A zu verweisen. Es wurde schließlich beschlossen, keine neuen Schlüsselwörter einzuführen, sondern das bereits reservierte statische Schlüsselwort zu verwenden.

Dies ist die Wurzel der späten statischen Bindung – eine alternative Verwendung des statischen Schlüsselworts . Für das Beispiel am Anfang des Artikels können Sie es wie folgt ändern:

return new static(); // 改变这里,后期静态绑定

Wenn Sie die späte statische Bindung verwenden, werden Sie sich sehr entspannt fühlen, wenn Sie PHP verwenden, um das Designmuster in 23 zu implementieren .

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Detaillierte Erläuterung der Schritte zur Implementierung eines Gästebuchs auf Basis von objektorientiertem PHP

Verwendung von PHP Single Fallanalyse des Verantwortungsprinzips (SRP)

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der verzögerten statischen Bindung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn