liaison statique retardée php : fait référence au soi de la classe, qui n'est pas basé sur le moment de la définition, mais sur les résultats en cours d'exécution lors du calcul.
(1) Lorsque l'objet instancié de la sous-classe $stu appelle la méthode say, elle est exécutée dans la classe parent Human, donc self::hei() dans say() est le hei() de la classe parent . )méthode.
(2) static::method name() : Si vous utilisez le mot-clé static, vous rechercherez d'abord la méthode dans la sous-classe si elle n'est pas trouvée, recherchez-la dans la classe parent ;
Scénario d'utilisation
Observez d'abord le code suivant :
abstract class base { //do sth } class aClass extends base{ public static function create(){ return new aClass(); } } class bClass extends base{ public static function create(){ return new bClass(); } } var_dump(aClass::create()); var_dump(bClass::create());
Sortie :
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
Les aClass et bClass ci-dessus héritent de la base de classe abstraite, mais la méthode statique create() est également implémentée dans les deux sous-classes. Suivant l'idée du oop, ce type de code répété devrait être implémenté dans la base de classe parent.
Code amélioré
abstract class base { public static function create(){ return new self(); } } class aClass extends base{ } class bClass extends base{ } var_dump(aClass::create()); var_dump(bClass::create());
Le code actuel semble être conforme à nos idées précédentes, et la méthode create() est partagée dans le parent classe Ok, lançons-le et voyons ce qui se passe.
Impossible d'instancier la classe abstraite base dans...
Malheureusement, le code ne semble pas s'exécuter comme prévu, self() dans la classe parent est analysé comme base Ce parent la classe n'hérite pas de ses sous-classes. Ainsi, afin de résoudre ce problème, le concept de liaison statique retardée a été introduit dans php5.3.
Liaison statique retardée
abstract class base { public static function create(){ return new static(); } } class aClass extends base{ } class bClass extends base{ } var_dump(aClass::create()); var_dump(bClass::create());
Ce code est presque le même que le précédent La différence est que self est remplacé par le mot-clé static, static Il sera résolu en une sous-classe au lieu d'une classe parent, afin que les problèmes rencontrés ci-dessus puissent être résolus. Il s'agit de la liaison statique retardée de PHP.
Enfin, exécutez le code et obtenez le résultat final souhaité.
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
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!