Scénarios 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 in La méthode statique create() est implémentée dans les deux sous-classes. Suivant l'idée oop, ce code répétitif 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. La méthode create() est partagée dans la classe parente 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 sera résolu en une sous-classe au lieu de. 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) { }
Pour plus d'articles traitant simplement de la liaison statique retardée PHP, veuillez faire attention au site Web PHP chinois !