• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP实现单例模式最安全的做法_php实例

php 搞代码 4年前 (2022-01-26) 36次浏览 已收录 0个评论

作为一种常用的设计模式,单例模式被广泛的使用。那么如何设计一个单例才是最好的呢?

通常我们会这么写,网上能搜到的例子也大部分是这样:

class A<BR>{<BR>    protected static $_instance = null;<BR>    protected function __construct()<BR>    {<BR>        //disallow new instance<BR>    }<BR>    protected function __clone(){<BR>        //disallow clone<BR>    }<BR>    public function getInstance()<BR>    {<BR>        if (self::$_instance === null) {<BR>            self::$_instance = new self();<BR>        }<BR>        return self::$_instance;<BR>    }<BR>}<BR>class B extends A<BR>{<BR>    protected static $_instance = null;<BR>}</P><P>$a = A::getInstance();<BR>$b = B::getInstance();<BR>var_dump($a === $b);


将__construct方法设为私有,可以保证这个类不被其他人实例化。但这种写法一个显而易见的问题是:代码不能复用。比如我们在一个一个类继承A:

class B extends A<BR>{<BR>    protected static $_instance = null;<BR>}</P><P>$a = A::getInstance();<BR>$b = B::getInstance();<BR>var_dump($a === $b);


上面的代码会输出:

bool(true)


问题出在self上,self的引用是在类被定义时就决定的,也就是说,继承了B的A,他的self引用仍然指向A。为了解决这个问题,在PHP 5.3中引入了后期静态绑定的特性。简单说是通过static关键字来访问静态的方法或者变量,与self不同,static的引用是由运行时决定。于是简单改写一下我们的代码,让单例模式可以复用。

</P><P>class C<BR>{<BR>    protected static $_instance = null;<BR>    protected function __construct()<BR>    {</P><P>    }<BR>    protected function __clone()<BR>    {<BR>        //disallow clone<BR>    }<BR>    public function getInstance()<BR>    {<BR>        if (static::$_instance === null) {<BR>            static::$_instance = new static;<BR>        }<BR>        return static::$_instance;<BR>    } <BR>}<BR>class D extends C<BR>{<BR>    protected static $_instance = null;<BR>}<BR>$c = C::getInstance();<BR>$d = D::getInstance();<BR>var_dump($c === $d);


以上代码输出:

bool(false)


这样,简单的继承并重新初始化$_instance变量就能实现单例模式。注意上面的方法只有在PHP 5.3中才能使用,对于之前版本的PHP,还是老老实实为每个单例类写一个getInstance()方法吧。

需要提醒的是,PHP中单例模式虽然没有像Java一样的线程安全问题,但是对于有状态的类,还是要小心的使用单例模式。单例模式的类、本文来源gao($daima.com搞@代@#码$网搞gaodaima代码会伴随PHP运行的整个生命周期,对于内存也是一种开销。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP实现单例模式最安全的做法_php实例
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址