Explication détaillée sur l'utilisation et les précautions du mot-clé statique en php

黄舟
Libérer: 2023-03-12 12:02:01
original
1315 Les gens l'ont consulté

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++;
}
Copier après la connexion

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 &#39;Ststic obj:&#39;,"<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 &#39;Ststic obj:&#39;,"<br />";
	 var_dump($obj);
	 if(is_null($obj)){
		 $obj = new stdClass();
	 }
	 return $obj;
 }
 $obj = get_obj_noref();
 $obj2 = get_obj_noref();
Copier après la connexion

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

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().&#39; &#39;.static::$var2.&#39;
&#39;; 
  } 
} 
class B extends A { 
  protected static $var1 = &#39;b&#39;;   
} 
class C extends A { 
  protected static $var1 = &#39;c&#39;;   
} 
B::test(); 
C::test(); </span>
Copier après la connexion

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!

É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