Maison >développement back-end >tutoriel php >Un examen approfondi de la liaison statique retardée PHP

Un examen approfondi de la liaison statique retardée PHP

不言
不言original
2018-04-09 15:24:521334parcourir

Cet article vous présente principalement les informations pertinentes sur la liaison statique retardée PHP. Je le partagerai avec vous ici. Les amis dans le besoin peuvent s'y référer

Avant-propos<.>

La liaison statique dite retardée, comme son nom l'indique, lors d'un appel statique, la liaison de la partie sur le côté gauche du symbole :: est retardée, c'est-à-dire qu'elle n'est pas n'est plus analysé dans la classe dans laquelle la méthode actuelle est définie, mais calculé pendant l'exécution réelle. Cet article présente principalement le contenu pertinent sur la liaison statique retardée PHP. Je ne dirai pas grand-chose ci-dessous, jetons un coup d'œil à l'introduction détaillée.

Sentir quelque chose de mauvais

En regardant le code PHP en arrière-plan du projet pendant cette période, j'ai vu un morceau de code similaire au suivant, je l'ai retiré :

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

Est-ce que vous sentez un mauvais code ? Comme vous pouvez le voir, il existe une fonction de création dans les classes MySQLHandler et MemcachedHandler. Après avoir supprimé mes instructions de sortie, j'ai constaté qu'elles étaient exactement les mêmes. Il s'agit d'une redondance de code. Oui, une refactorisation du code est requise.

Réaliser un refactoring simple

Le refactoring de code est partout, du moment que vous y réfléchissez et que vous sentez qu'il y a une amélioration, faites-le. Vous devez appuyer sur le clavier et commencer à travailler. Allez, refactorisez le code ci-dessus comme suit :

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

Déplacez la fonction create dans la classe DBHandler, ça a l'air bien, au moins moins C'est beaucoup de mauvais code.

semble faux

Exécutez-le, mais vous constatez que le

auquel nous nous attendions n'est pas imprimé. Que se passe-t-il? Cela montre que la fonction get de MySQLHandler n'est pas appelée, mais le code l'appelle clairement. Cela montre qu'il y a un problème avec le code MySQL get()  . Qu'est-ce qui ne va pas avec ça ? Cela nous amène au point central du résumé d’aujourd’hui : la liaison statique retardée. new self()

Liaison statique retardée

La liaison statique retardée a été introduite après PHP5.3. Regardez à nouveau le morceau de code suivant :

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

Le code ci-dessus génère A, mais je veux qu'il génère B. C'est le problème. C'est aussi une limitation de soi et de __CLASS__. Une référence statique à la classe actuelle en utilisant self:: ou __CLASS__, selon la classe dans laquelle la méthode actuelle est définie. Cela explique donc très bien pourquoi le code ci-dessus génère A. Mais que se passe-t-il si nous devons produire B ? Vous pouvez faire ceci :

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

La liaison statique tardive est destinée à contourner la restriction en introduisant un nouveau mot-clé pour représenter la classe initialement appelée au moment de l'exécution. . En termes simples, ce mot-clé vous permet de faire référence à la classe B au lieu de A lors de l'appel de test() dans l'exemple ci-dessus. Il a finalement été décidé de ne pas introduire de nouveaux mots-clés, mais d'utiliser le mot-clé statique déjà réservé.

C'est la racine de la liaison statique tardive - une utilisation alternative du mot-clé static. Pour l'exemple au début de l'article, vous pouvez le modifier comme ceci :

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

Ce type de liaison statique tardive est utilisé lors de l'utilisation de PHP pour mettez en œuvre les 23 modèles de conception, vous vous sentirez très détendu.

Résumé

C'est un point de connaissance très simple, mais il est très utile Pour résumer, j'ai vérifié quelques informations. . Ajoutez quelques points de connaissances. Passez en revue le passé et apprenez le nouveau. D'accord, j'espère que cela aidera tout le monde. Si vous avez des suggestions pour améliorer mes articles, n'hésitez pas à les demander, j'ai besoin de votre aide.

Recommandations associées :

Explication détaillée de la liaison statique retardée PHP

Implémentation PHP de la liaison statique tardive


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn