一. new 对象和 clone 对象
学习单例模式之前,需要先搞清楚这两个关键字的用法,先看一个例子.
<?php
class Foo{
public $bar = 'A string';
}
$foo1 = new Foo;
$foo2 = new Foo;
$foo3 = clone $foo1;
var_dump($obj1, $obj2, $obj3);
上图中红色框框起来的数字代表了 $foo1 $foo2 $foo3 这三个对象分别引用了不同的地址,也就是无论是用 new 关键字,还是 clone 关键字所产生的对象都不是同一个.
问题在于,如果每一次使用该类的实例,都去产生一个新对象,就会浪费资源,单例模式就很好的解决了这个问题,在单例模式中,首先需要禁用 __construct( ) 方法,也就意味着不能从类的外部去 new 该类了,其次需要禁用 __clone( ) 方法,也就意味不能通过克隆该类的实例获得新对象.
二. 单例模式
<?php
class Foo
{
public $bar = 'A string';
//1.创建一个静态私有属性,用于保存当前类的实例
private static $instance = null;
//2.构造方法私有化,从而禁止从外部用new关键字创建实例
private function __construct()
{
}
//3.克隆方法私有化,从而禁止从外部通过clone关键字创建实例
private function __clone()
{
}
//4.定义公共静态方法,用于生成当前类的实例
public static function getInstance()
{
//如果$instance变量中保存的不是当前类的实例
if (!self::$instance instanceof self) {
//那么就new一个当前类,并保存在$instance中
self::$instance = new self();
}
//否则直接返回$instance
return self::$instance;
}
}
$foo1 = Foo::getInstance();
$foo2 = Foo::getInstance();
$foo3 = Foo::getInstance();
var_dump($foo1, $foo2, $foo3);
注意上图中圈起来的数字,三个对象都指向同一个地址.