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); ?>
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); ?>
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(); ?>
<?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(); ?>
return new static(); // 改变这里,后期静态绑定
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!