Maison > Article > développement back-end > Explication détaillée du mode php singleton
En fait, le modèle singleton, pour parler franchement, signifie qu'une classe ne peut être instanciée qu'une seule fois. Mais comment faire toute une histoire autour de cette instanciation ? En fait, une avancée majeure est la méthode magique __construct(). Cette méthode signifie que si la classe est instanciée, cette méthode sera automatiquement exécutée. Alors si je rends cette méthode protégée ou privée, quel sera l'effet ?
<?php class test{ protected function __construct(){ } } $test = new test(); ?>
Ensuite, exécutez ce qui suit et cette situation se produira.
<img data-raweight="125" data-rawwidth="994" src="https://img.php.cn/upload/article/000/054 /025/a79c550120d3e119df603c5755b0f293-0.jpg" class="origin_image zh-lightbox-thumb" width="994" src="https://pic4.zhimg.com/3a977167d4bb4083db5218628d34 e0d3_r.jpg"> ; Dans ce cas, il ne peut pas être instancié. Cela garantit qu'il ne peut pas être instancié par quelqu'un d'autre.
Mais dans ce cas, comment devrions-nous implémenter l'instanciation. Ça y est :
<?phpclass test{ protected function __construct(){ } public static function getInstance(){ $_test = new test(); return $_test; }}$test = test::getInstance();var_dump($test);?>
C'est ça. Un exemple apparaîtra. Jetons un coup d'oeil :
<img data-raweight="50" data-rawwidth="152" src="https://img.php.cn/upload/article/000 / 054/025/a79c550120d3e119df603c5755b0f293-1.jpg" class="content_image" width="152">Mais après avoir dit tant de choses, je ne suis toujours pas arrivé au point. Voici le point clé, à condition d'utiliser un autre mot-clé (statique). Dang Dang Dang Dang :
<?php class test{ protected function __construct(){ } public static function getInstance(){ static $_test; if (empty($_test)) { $_test = new test(); } return $_test; } } $test1 = test::getInstance(); $test2 = test::getInstance(); $test3 = test::getInstance(); var_dump($test1,$test2,$test3); echo $test1 == $test2 ? 'true' : 'false'; echo "<br>"; echo $test2 == $test3 ? 'true' : 'false'; echo "<br>"; echo $test1 == $test3 ? 'true' : 'false'; ?>
Regardez le résultat :
<img data-raweight="160" data - largeur brute="133" src="https://img.php.cn/upload/article/000/054/025/a79c550120d3e119df603c5755b0f293-2.jpg" class="content_image" largeur="133"" ;amp;gt;De cette façon, l'effet du singleton PHP peut être obtenu.
Pour les singletons, il est préférable d'utiliser uniquement cette classe au lieu de plusieurs classes.
Par exemple. Par exemple, il existe une classe de configuration qui stocke principalement les informations de configuration de ce projet. Si cette classe peut être instanciée plusieurs fois, alors si la configuration est modifiée pendant l'exécution du code, comment savoir dans quelle classe de configuration la modification a été effectuée. Pour le moment, l'utilisation du mode singleton évitera cette situation. Toutes les modifications apportées au fichier de configuration seront modifiées en fonction de l'instance de cette classe. Il ne semblera pas qu'en raison de l'instanciation de plusieurs classes, l'opération ne soit pas mise à jour en temps réel pour les modifications apportées à l'opération. De plus, l’instanciation de plusieurs bibliothèques de classes occupera beaucoup de mémoire, elles ne seront donc instanciées qu’une seule fois. N'y a-t-il pas beaucoup d'avantages ?
Autres insights :
Les clones privés aussi
class test{ private static $instance; private function __construct(){ } private function __clone(){ } public static function getInstance(){ if (! self::$instance instanceof self ) { self::$instance = new self(); } return self::$instance; } }
Une méthode plus intuitive :
Cliquez pour ouvrir le lien
/* 单例设计模式 (单态) 定义: 一个类 只能允许有 一个对象存在. 1.不让进: 使类不能被实例化 2.留后门: 设置静态方法 3.给对象: 在静态方法里实例化该类 4.判初夜: 判断是否是 第一次产生该类的对象 5.设静态: 静态方法里 要使用静态属性 */ /*//1.不让进: 使类不能被实例化----------------- class Test { // 设置 一个封装的构造方法 private function __construct() { //占位, 我就是不让你NEW我~~~ } }*/ /*//2.留后门: 设置静态方法-------------------- class Test { // 设置 一个封装的构造方法 private function __construct() { //占位, 我就是不让你NEW我~~~ } //后门 public static function getObject() { echo "啊,我是后门,进吧!<br>"; } }*/ /*//3.给对象: 在静态方法里实例化该类------------------ class Test { // 设置 一个封装的构造方法 private function __construct() { //占位, 我就是不让你NEW我~~~ } //后门 public static function getObject() { echo "啊,我是后门,进吧!<br>"; return new self();//实例化一个对象给你 } }*/ /*//4.判初夜: 判断是否是 第一次产生该类的对象------------------ class Test { private $obj = null;//属性值为对象,默认为null // 设置 一个封装的构造方法 private function __construct() { //占位, 我就是不让你NEW我~~~ } //后门 public static function getObject() { echo "啊,我是后门,进吧!<br>"; if ($this->obj === null) { $this->obj = new self();//实例化一个对象 } //返回的属性 其实就是本对象 return $this->obj; } }*/ //5.设静态: 静态方法里 要使用静态属性------------------ class Test { private static $obj = null;//属性值为对象,默认为null // 设置 一个封装的构造方法 private function __construct() { //占位, 我就是不让你NEW我~~~ } //后门 public static function getObject() { echo "啊,我是后门,进吧!<br>"; if (self::$obj === null) { self::$obj = new self();//实例化一个对象 } //返回的属性 其实就是本对象 return self::$obj; } } /*Test::getObject();//使用静态方法访问该类里的方法 exit;*/ $t1 = Test::getObject(); $t2 = Test::getObject(); $t3 = Test::getObject(); $t4 = Test::getObject(); $t5 = Test::getObject(); $t6 = Test::getObject(); $t7 = Test::getObject(); $t8 = Test::getObject(); //判断 两个对象 是否是同一个对象 if ($t1 === $t6) { echo "哦, Yes! 是同一个实例<br>"; } else { echo "哦, No! 不是同一个实例<br>"; }
Recommandations associées :
Analyse des avantages du mode PHP singleton
PHP singleton Explication détaillée de l'exemple de démonstration du mode
Partage d'une utilisation simple du mode PHP singleton
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!