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

首先看这个用了单例模式的类

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值