Maison > Article > développement back-end > Explication détaillée sur l'utilisation et les précautions du mot-clé statique en php
PHP mot-clé statique est utilisé pour définir des méthodes statiques et des attributs, qui peuvent être utilisés pour retarder la liaison statique dans les classes et les modifier dans fonctions variables.
1 : Parlons d'abord de l'utilisation du statique dans les fonctions
function add(){ static $a = 0; echo $a,"<br />"; $a++; }
Le rôle de static ici est similaire au rôle de static en C, garantissant que la variable $a ne sera initialisée que lorsque add() est appelé pour la première fois, mais c'est Il est important de noter que la définition Lorsqu'une variable statique reçoit une valeur initiale, il n'est pas nécessaire d'attribuer une valeur initiale. Cependant, lors de l'attribution d'une valeur initiale, vous ne pouvez pas utiliser des expressions ou appeler des fonctions pour attribuer des valeurs. , sinon une erreur sera signalée.
Une autre chose à noter est que les variables statiques ne stockent pas de références, comme suit :
function get_obj_ref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = &new stdClass(); } return $obj; } $obj = get_obj_ref(); $obj2 = get_obj_ref(); function get_obj_noref(){ static $obj = null; echo 'Ststic obj:',"<br />"; var_dump($obj); if(is_null($obj)){ $obj = new stdClass(); } return $obj; } $obj = get_obj_noref(); $obj2 = get_obj_noref();
Quand Lorsque la référence est stockée de manière statique, la valeur de la variable n'est pas enregistrée après avoir appelé la fonction une deuxième fois, et une erreur Obsolète sera signalée lors de l'exécution du programme ci-dessus, c'est-à-dire l'utilisation de la référence de retour l’attribution de valeur a été abandonnée.
2 : liaison statique retardée de static dans la classe
liaison statique retardée ; permet de référencer la classe appelée dans le contexte d'un héritage statique. Liaison retardée signifie : static :: n'est plus la classe dans laquelle la méthode actuelle est définie, mais la classe dans laquelle elle est réellement exécutée. Remarque : Il peut être utilisé pour appeler (mais sans s'y limiter) méthodes statiques.
En plus de la simple utilisation de la liaison statique retardée, il existe également un appel direct, c'est-à-dire en utilisant self::, parent::, static:: et forward_static_call() (cette fonction ne peut être appelée que dans une méthode) transmettra les informations d'appel, comme suit :
class A { public static function foo() { static::who(); } public static function who() { echo CLASS."\n"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo CLASS."\n"; } } class C extends B { public static function who() { echo CLASS."\n"; } } C::test();
Le résultat obtenu ici est A C C. Évidemment, lors de l'appel de parent::foo(), la classe d'appel du runtime est toujours utilisée.
Une autre chose à noter est : Seules les classes statiques explicitement déclarées sont subordonnées et sous-classées.
La partie suivante du contenu fait référence à cet article de blog : Cliquez pour ouvrir le lien : Héritage statique PHP
<span style="font-size:18px;">class A { protected static $var1 = null; protected static $var2 = null; public static function test(){ if(!static::$var2){ static::$var2 = static::$var1; } echo get_called_class().' '.static::$var2.' '; } } class B extends A { protected static $var1 = 'b'; } class C extends A { protected static $var1 = 'c'; } B::test(); C::test(); </span>
Le résultat obtenu ici est b b. Ici, la classe B a d'abord appelé la méthode test() et la variable $var2 s'est vu attribuer une valeur après l'appel. Cependant, la classe C n'a pas défini sa propre variable $var2 et la valeur de la variable $var2 existe déjà dans le fichier. classe parent, elle peut donc être utilisée directement si dans la classe B Si la variable $var2 est explicitement définie dans , le résultat sera différent.
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!