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

青灯夜游
青灯夜游avant
2020-07-24 17:06:352776parcourir

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

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

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

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静态方法进行初始化

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer