当前位置: 博客首页 >> 片言碎语 >> 阅读正文

【设计模式】php设计模式之单例模式学习

作者: 郑晓 分类: 片言碎语 发布于: 2014-06-17 18:17 浏览:5,109 评论(2)


什么是单例模式,单例模式顾名思义,就是只有一个实例。作为对象的一种创建模式, 单例模式确保了某一个类有且只有一个实例,而且通过自身完成实例化并向整个系统提供这个实例。

一个单例模式的类,要具备以下几点要求: 1、构造函数须要标记为private(访问控制:声明为私有方法,防止外部代码直接使用new来创建对象),单例类不能在其他类中实例化,只能被其自身实例化。 2、拥有一个保存类的实例的私有静态成员变量。 3、拥有一个访问这个实例的公共的静态方法(一般常用getInstance()方法进行实例化类,或返回已经实例化的对象,通过instanceof操作符可以检测到类是否已经被实例化) 4、需要创建__clone()方法防止对象被复制(克隆),当代码中使用clone操作符进行对象克隆时会调用这个方法。

为什么使用PHP单例模式?

  1. php的单例主要应用于数据库应用中, 一般在一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源,还可以减少数据库连接这样就不容易出现too many connections情况。

  2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现。

  3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处的打印。。。

</p> <p><?php /**</p> <ul> <li>设计模式之单例模式</li> <li>$_instance必须声明为静态的私有变量</li> <li>构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义</li> <li>getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用</li> <li>::操作符只能访问静态变量和静态函数</li> <li>new对象都会消耗内存</li> <li>使用场景:最常用的地方是数据库连接。</li> <li>使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。 */ class demo { //保存例实例在此属性中   private static $_instance;</li> </ul> <p>  //构造函数声明为private,防止直接创建对象   private function __construct() {     echo '我被实例化了!';   }</p> <p>  //单例方法   static function get_instance() {     if(!isset(self::$_instance)) {       self::$_instance=new self();     }     return self::$_instance;   }</p> <p>  //阻止用户复制对象实例   private function __clone() {     trigger_error('不允许复制!' ,E_USER_ERROR);   }</p> <p>  function test() {     echo("test");</p> <p>  } }</p> <p>// 这个写法会出错,因为构造方法被声明为private //$test = new demo;</p> <p>// 下面将得到类的单例对象,执行后会发现构造方法只会调用一次。 $test1 = demo::get_instance(); $test2 = demo::get_instance(); $test3 = demo::get_instance();</p> <p>$test1->test();</p> <p>//复制对象将导致一个E_USER_ERROR错误. $test4 = clone $test; ?></p> <p>

       

本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/she-ji-mo-shi-php-she-ji-mo-shi-zhi-dan-li.html

【设计模式】php设计模式之单例模式学习:目前有2 条留言

用户评论头像 刘春晓的博客发表于 2014年06月22日 17:34[回复]

你好 朋友 有没有兴趣做友情链接

用户评论头像 女装屋发表于 2014年06月18日 00:52[回复]

😎 😎 😆 学习了

发表评论

change vcode