首先看这个用了单例模式的类
class SingleInstanceClass {
}
$s = SingleInstanceClass::instance();
$s->name = 'panda';
$s->test();
echo "<br/>";
$c = SingleInstanceClass::instance();
$c->name = '111';
$c->test();
echo "<br/>";
$s->test();
注:这段代码调用了3次test 结果为panda 111 111
问题来了 有些人会说为什么不是panda 111panda呢这就是单例模式的特别之处此终只有一个实例生成
先来说说什么是单例模式:
构造函数是私有的(private),也就是说这个类不能在外部被实例化
而只有通过静态方法instance()才能获取到这个类的实例。
而在instance()中通过判$_instance是否为空来确定是否实例化SingleInstanceClass类,同时也保障了SingleInstanceClass永远只有一个实例
在上面这个例子中:↑
$s 首先获得这个实例 然后给成员变量name赋值 输出 panda
然后$c 把这个实例拿过来了 为什么说拿过来了 而不是又生成一个实例
因为再一次调用instance();方法时,会判断$_instance是否为空($_instance会在内存中驻留一段时间),不为空,则返回最初初始化的实例
*注:静态变量的赋值操作只会在变量第一次初始化时会被调用,在之后函数的执行过程中,这个操作不会被调用
所以由此至终都是$s = SingleInstanceClass::instance(); 这个操作初始化的对象
上例中$c获得这个实例 又给实例重新赋值 然后输出 111
而由于$c和$s获得的是同一个实例 所以最下面的 $s->test(); 输出也是 111