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

高洛峰
Libérer: 2023-03-04 10:46:02
original
967 Les gens l'ont consulté

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());
Copier après la connexion

Sortie :

object(aClass)#1 (0) { } object(bClass)#1 (0) { }
Copier après la connexion
Copier après la connexion

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());
Copier après la connexion

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());
Copier après la connexion

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) { }
Copier après la connexion
Copier après la connexion

Pour plus d'articles traitant simplement de la liaison statique retardée PHP, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal