您的位置:首页 > 编程语言 > PHP开发

关于php面向对象的复习(2)--单例模…

2013-12-24 22:52 106 查看
首先看这个用了单例模式的类

class SingleInstanceClass {

    privatestatic $_instance;

 var $name;

   

    privatefunction __construct()

    {

   

    }

   

    publicstatic function instance()

    {

       if (self::$_instance == NULL)

           self::$_instance = new SingleInstanceClass();

       return self::$_instance;

    }

  public function test(){

  

   echo$this->name;

   }

}

$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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: