Maison >développement back-end >tutoriel php >Un examen approfondi de la liaison statique retardée PHP
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
<?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
<?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
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
<?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é
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!