Maison >développement back-end >tutoriel php >Parlons brièvement de la liaison statique retardée de PHP

Parlons brièvement de la liaison statique retardée de PHP

高洛峰
高洛峰original
2016-12-26 16:09:491008parcourir

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 !

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