单例模式:只能实例化一次即为单例模式
如何实现只能实例化一次:突破口在于类的构造函数,我们把构造方法变为隐私或者受保护的方法,然后执行代码
<?php Class Temp { protected function __construct () { } } $test = new Temp();
上面的代码执行会有如下报错
这样的话就不能实例化了,别人也不能随便的实例化它,但是我们自己应该如何实例化它呢?进一步修改代码
<?php Class Temp { protected function __construct () { } public static function getInstance () { $test = new Temp(); return $test; } } // $test = new Temp(); $test = Temp::getInstance(); var_dump($test);
运行代码,便可以得到一个对象
这说明我们已经成功的实例化了这个类,这说明我们成功的实例化了这个类。
但是这并没有达到我们要的目的,修改代码如下
<?php Class Temp { protected function __construct () { } public static function getInstance () { $test = new Temp(); return $test; } } // $test = new Temp(); $test1 = Temp::getInstance(); $test2 = Temp::getInstance(); $test3 = Temp::getInstance(); if ($test1 === $test2) { echo ‘同一个‘; } else { echo ‘不是同一个‘; }
执行代码
等到else的结果,这证明这是两个不一样的实例,也就是说我们并没有实现单例,继续修改代码如下
<?php Class Temp { protected function __construct () { } public static function getInstance () { static $test; if (empty($test)) { $test = new Temp(); } return $test; } } // $test = new Temp(); $test1 = Temp::getInstance(); $test2 = Temp::getInstance(); $test3 = Temp::getInstance(); if ($test1 === $test2) { echo ‘同一个‘; } else { echo ‘不是同一个‘; }
运行代码
这次获得的结果为条件成立的结果,证明这两个实例其实是同一个实例,到此我们便实现了我们的目的,这个类只会被实例化一次,此即为单例模式。