Maison > développement back-end > tutoriel php > Parlons du mode singleton et des variables statiques en PHP

Parlons du mode singleton et des variables statiques en PHP

青灯夜游
Libérer: 2023-04-09 10:54:01
avant
2771 Les gens l'ont consulté

Parlons du mode singleton et des variables statiques en PHP

En PHP, il n'y a pas de variables statiques au sens général. Contrairement à Java et C++, la période de survie des variables statiques en PHP n'est que la période de session de chaque PHP, il est donc prévu qu'il n'y ait pas de variables statiques comme Java ou C++.

Variables statiques en PHP

En PHP, la signification des variables statiques n'est que dans une certaine structure (méthode ou classe), sa portée est dans ce fichier.

function test(){
    static $var = 1; 
    echo $var++.'';
}
test();
test();
test();
//OutPut
//1
//2
//3
Copier après la connexion

Dans les trois appels de la fonction test, la variable $var existe dans les trois appels, et est incrémentée de 1 à chaque fois, mais n'est ni effacée ni réinitialisée
On peut donc tirer une conclusion, statique des variables existent toujours dans le cycle de vie de la structure actuelle. Dans l'exemple actuel, le cycle de vie de la fonction de test est le script PHP actuel, qui est valide tant que le programme n'est pas publié.

Les variables statiques sont dans la classe

Et dans la classe, le code ressemble à ceci

class A
{
    private static $a = 1; 
    private $b = 2;
    public function add()
    {
        echo self::$a++.'';
        echo $this->b++.'';
    }
}
$class1 = new A();
$class1->add();
$class1->add();
$class2 = new A();
$class2->add();
$class2->add();
//Output
//1
//2
//2
//3
//3
//2
//4
//3
Copier après la connexion

D'en haut Juger à partir des résultats d'exécution de la classe, nous avons également obtenu le même résultat dans la fonction

Ensuite, pour résumer,

Les variables statiques de PHP sont dans le cycle de vie de la structure correspondante Permanent existence, et la valeur reste cohérente, quel que soit le nombre de fois que la structure est appelée ou instanciée.

En fait, c'est la différence entre les variables dynamiques et les variables statiques. Voir cet article pour plus de détails. Les variables dynamiques ne sont valides qu'au sein de la classe, tandis que les variables statiques se trouvent dans le script PHP actuel.

Les variables statiques sont en mode singleton

Regardez à nouveau le mode singleton

class A
{
    private static $instance = null;
    private $b = 1;
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname(); 
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b变量完全相同!
$a->add();
$a->show();
echo '';
$b->show();
//output
//2
//2
Copier après la connexion

En ce moment, en raison du singleton Le mode exemple existe, faisant de $a et $b exactement le même objet, donc si vous avez besoin de partager des données entre eux, il n'y a pas du tout besoin de variables statiques (un non-sens, juste vous-même. Parce qu'à tout moment, il n'y aura que soyez cette classe dans l'application. Une instance existe ! Peu importe le nombre de fois que vous appelez le singleton, les données qu'il contient ne seront pas réinstanciées)

Donc, en mode singleton, les variables statiques n'ont aucune signification. du tout. Bien sûr, si vous n'avez rien à faire et insistez pour utiliser la nouvelle méthode pour initialiser l'objet, ce n'est pas grave. À ce stade, le mode singleton est interrompu et revient à l'état sans mode singleton.

Si vous souhaitez éviter d'utiliser new pour instancier des objets, vous pouvez envisager de définir la fonction __construct de la classe comme attribut privé

class A
{
    private static $instance = null;
    private $b = 1;
    private function __construct()
    {
    //Code in this function
    //could not be get out of the class
    }
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname();
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b 变量完全相同!
$a->add();
$a->show();
echo '
';
$b->show();
//output
//2
//2
  
//如果尝试用new来实例化的话
$c = new A();
//output
//Fatal error: Call to private A::__construct() from invalid context in
//如果需要A类的实例化对象,只能通过开放的get_instance静态方法进行初始化
Copier après la connexion

Avantages : Le mode singleton peut éviter un grand nombre de nouveaux opérations, car chaque Une nouvelle opération consommera des ressources mémoire et des ressources système

Inconvénients : En PHP, toutes les variables, qu'il s'agisse de variables globales ou de membres statiques de la classe, sont au niveau de la page à chaque fois. exécuté, il sera ré- Lorsque de nouveaux objets seront créés, ils seront effacés après l'exécution de la page. Il semble que le mode PHP singleton n'ait aucun sens, donc je pense que le mode PHP singleton est uniquement destiné à plusieurs scénarios d'application lorsqu'une seule page. -Une requête de niveau se produit et doit partager les mêmes ressources d'objet sont très significatives

Tutoriels associés recommandés : "Tutoriel PHP"

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:cnblogs.com
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