Maison >développement back-end >tutoriel php >Analyser le mot-clé self de PHP
Quelqu'un dans le groupe PHP a posé des questions sur l'utilisation du mot-clé self
La réponse est relativement évidente : vous ne pouvez pas utiliser this
pour appeler des fonctions non membres au sein d'un membre statique. fonction, mais vous pouvez utiliser self
Appeler des fonctions/variables/constantes membres statiques ; d'autres fonctions membres peuvent utiliser self
pour appeler des fonctions membres statiques et des fonctions membres non statiques. Au fur et à mesure que la discussion s'approfondissait, j'ai découvert que self
n'était pas si simple. Compte tenu de cela, cet article compare et différencie d'abord plusieurs mots-clés, puis résume l'utilisation de self
. La différence entre
parent
, static
et this
Pour bien comprendre self
, il faut le distinguer de parent
, static
et this
ouvert. Des comparaisons sont faites ci-dessous. La distinction entre
parent
self
et parent
est relativement simple : parent
fait référence à la méthode (ou variable) cachée de la classe parent/classe de base, et self
Référence à sa propre méthode (ou variable). Par exemple, le constructeur de la classe parent est appelé dans le constructeur :
class Base { public function __construct() { echo "Base contructor!", PHP_EOL; } } class Child { public function __construct() { parent::__construct(); echo "Child contructor!", PHP_EOL; } } new Child; // 输出: // Base contructor! // Child contructor!
static
static
Le but général est de modifier la fonction ou la variable pour en faire une fonction de classe et une classe variable, et elle peut également être modifiée dans la fonction. Les variables prolongent leur durée de vie tout au long de la durée de vie de l'application. Mais son association avec self
est une nouvelle utilisation introduite depuis PHP 5.3 : la liaison statique retardée.
Avec la fonction de liaison statique retardée de static
, la classe appartenant peut être déterminée dynamiquement au moment de l'exécution. Par exemple :
class Base { public function __construct() { echo "Base constructor!", PHP_EOL; } public static function getSelf() { return new self(); } public static function getInstance() { return new static(); } public function selfFoo() { return self::foo(); } public function staticFoo() { return static::foo(); } public function thisFoo() { return $this->foo(); } public function foo() { echo "Base Foo!", PHP_EOL; } } class Child extends Base { public function __construct() { echo "Child constructor!", PHP_EOL; } public function foo() { echo "Child Foo!", PHP_EOL; } } $base = Child::getSelf(); $child = Child::getInstance(); $child->selfFoo(); $child->staticFoo(); $child->thisFoo();
Le résultat du programme est le suivant :
Base constructor! Child constructor! Base Foo! Child Foo! Child Foo!
En termes de références de fonction, la différence entre self
et static
est : pour les fonctions membres statiques, self
pointe vers la classe actuelle du code, static
pointe vers la classe appelante ; pour les fonctions membres non statiques, self
supprime le polymorphisme et pointe vers la fonction membre de la classe actuelle static
est équivalent à this
. , qui pointe dynamiquement vers la fonction de la classe appelante. Les trois mots-clés
parent
, self
et static
sont très intéressants à regarder ensemble. Ils pointent respectivement vers la classe parent, la classe actuelle et la sous-classe, qui ont un peu un ". saveur passée, présente et future.
this
self
et this
sont les combinaisons les plus discutées et les plus susceptibles d'être mal utilisées. Les principales différences entre les deux sont les suivantes :
this
ne peut pas être utilisé dans les fonctions membres statiques, self
peut self
au lieu de $this::
ou $this->
; self
pour accéder aux variables membres non statiques, uniquement this
;this
À utiliser lorsque l'objet a été instancié, self
n'a pas cette restriction ; self
supprime le comportement polymorphe et fait référence à la fonction de classe actuelle ; et la référence this
appelle la fonction de remplacement de la classe (le cas échéant). Les utilisations de self
Après avoir lu les différences entre les trois mots-clés ci-dessus, l'utilisation de self
est-elle immédiatement apparente ? Pour résumer en une phrase, c'est-à-dire : self
pointe toujours vers "la classe actuelle (et l'instance de classe)". En détail, c'est :
this
doit être ajouté avec le symbole $
et doit l'être. ajouté. Le trouble obsessionnel-compulsif signifie que c'est très inconfortable ;$this->
, mais elles peuvent être appelées via self::
, et elles peuvent toujours fonctionner correctement. sans utiliser $this->
dans la fonction appelante. Ce comportement semble se comporter différemment dans différentes versions de PHP. C'est ok dans la version 7.3 actuelle self
dans les fonctions statiques et les fonctions non statiques. Ils sont tous string(4) "self"
, la sortie du puzzle return $this instanceof static::class;
aura des erreurs grammaticales, mais les deux façons d'écrire suivantes sont normales :
$class = static::class; return $this instanceof $class; // 或者这样: return $this instanceof static;
Alors pourquoi ce? !
Pour plus d'articles techniques liés à PHP, veuillez visiter la colonne Tutoriel PHP pour apprendre !
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!