Heim  >  Artikel  >  Backend-Entwicklung  >  Ein detaillierter Blick auf die verzögerte statische PHP-Bindung

Ein detaillierter Blick auf die verzögerte statische PHP-Bindung

不言
不言Original
2018-04-09 15:24:521249Durchsuche

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur verzögerten statischen PHP-Bindung ein. Ich werde sie hier mit Ihnen teilen.

Vorwort

Die sogenannte verzögerte statische Bindung, wie der Name schon sagt, ist beim statischen Aufruf die Bindung des Teils auf der linken Seite des ::-Symbols verzögert, das heißt, nein Wird nicht mehr in die Klasse analysiert, in der die aktuelle Methode definiert ist, sondern wird während der 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. Schauen wir uns die detaillierte Einführung an.

Rieche etwas Schlimmes

Als ich in dieser Zeit den PHP-Code im Hintergrund des Projekts betrachtete, sah ich ein Stück davon Code ähnlich dem folgenden, ich habe ihn herausgezogen:

<?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);
?>

Riechen Sie schlechten Code? Wie Sie sehen können, gibt es in den Klassen MySQLHandler und MemcachedHandler eine Erstellungsfunktion. 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, Tun Sie es einfach. Sie müssen auf die Tastatur drücken und mit der Arbeit beginnen. 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, sie sieht gut aus, zumindest weniger. Das ist eine Menge von schlechtem Code.

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 Codeabschnitt 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 dies 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 Schlüsselworts static. Für das Beispiel am Anfang des Artikels können Sie es wie folgt ändern:

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

Diese Art der späten statischen Bindung wird verwendet, wenn PHP verwendet wird Wenn Sie die 23 Designmuster umsetzen, werden Sie sich sehr entspannt fühlen.

Zusammenfassung

Es ist ein sehr einfacher Wissenspunkt, aber er ist sehr nützlich. Zusammenfassend habe ich einige Informationen überprüft . Fügen Sie einige Wissenspunkte hinzu. Lassen Sie die Vergangenheit Revue passieren und lernen Sie Neues kennen. Okay, ich hoffe, das hilft allen. Wenn Sie Vorschläge zur Verbesserung meiner Artikel haben, können Sie diese gerne stellen. Ich brauche Ihre Hilfe.

Verwandte Empfehlungen:

PHP verzögerte statische Bindung, detaillierte Erklärung

PHP-Implementierung der späten statischen Bindung


Das obige ist der detaillierte Inhalt vonEin detaillierter Blick auf die verzögerte statische PHP-Bindung. 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