单例模式: 跟名字所描述的一样,在所有调用过程中,这个类只需要实例化一次,减少外部通过new来多次实例化,形成多个实例;
主要应用场景:一般多数用于连接的操作,比如:数据库的连接、redis的连接
创建一个DB类,既然想给外部只调用一个实例,那么我们给外部调用的方法设置为静态的,静态方法内存中只占一份,在代码加载的时候就已经创建,实例化方法或类只有在new的时候才创建。每个实例化出来的对象都代表不同的实例,而静态只有一份。
class DB
{
/**
* 存储实例
*/
private static $_instance = null;
public function __construct()
{
//TODO
}
/**
* 获取实例
* @return object
*/
public static function getInstance()
{
if (is_null(self::$_instance)){
self::$_instance = new self();
}
return self::$_instance;
}
}
以上代码,我们从外部只需要调用DB::getInstance()这个方法,就能获取到这个类的实例,这个方法是属于实例的,而不是属于类的,下面我们进行测试:
$instance1 = DB::getInstance();
$instance2 = DB::getInstance();
var_dump($instance1);
var_dump($instance2);
结果:
$ php test.php
object(DB)#1 (0) {
}
object(DB)#1 (0) {
}
从结果来看,不管我们调用多少次这个getInstance()方法,它都是只有一个实例,从而实现了单例