国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > php设计模式实例之单例模式

php设计模式实例之单例模式

来源:程序员人生   发布时间:2013-11-02 10:29:41 阅读次数:2452次

本文章来给大家介绍php设计模式实例之单例模式方法,有需要了解的朋友可进入参考参考.

单例类:

1.构造函数需要标记为private,单例类不能再其他类中实例化,只能被其自身实例化

2.拥有一个保存类的实例静态成员变量

3.拥有一个访问这个实例的公共的静态方法.[常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到此类是否已经被实例化]

注:需要创建__clone()方法防治对象被复制

作用:

1.php的应用主要用于数据库,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量new操作消耗的资源

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

3.在一个页面请求汇总,便于进行调试,因为所有的代码都集中在一个类中,我们可以在类中设置钩子,输出日志,从而避免到处var_dump,echo.

php单例模式的例子.

实例代码如下:

  1. <?php 
  2. /** 
  3.  * 单例模式 
  4. */ 
  5. class DanLi{ 
  6.     //静态成员变量 
  7.     private static $_instance
  8.     //私有的构造方法 
  9.     private function __construct(){ 
  10.     } 
  11.     //防止对象被克隆 
  12.     public function __clone(){ 
  13.         trigger_error('Clone is not allow!',E_USER_ERROR); 
  14.     } 
  15.     public static function getInstance(){ 
  16.         if(!(self::$_instance instanceof self)){ 
  17.             self::$_instance = new self; 
  18.         } 
  19.         return self::$_instance
  20.     } 
  21.     public function test(){ 
  22.         echo "ok"
  23.     } 
  24.    
  25. //错误:$danli = new DanLi(); $danli_clone = clone $danli; 
  26. //正确:$danli = DanLi::getInstance(); $danli->test(); 
  27. ?> 

下面我们讨论下为什么要使用PHP单例模式?

多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育".   而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看.

1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源.

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

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

实例代码如下:

  1. <?php 
  2. /** 
  3. * 设计模式之单例模式 
  4. * $_instance必须声明为静态的私有变量 
  5. * 构造函数和析构函数必须声明为私有,防止外部程序new 
  6. * 类从而失去单例模式的意义 
  7. * getInstance()方法必须设置为公有的,必须调用此方法 
  8. * 以返回实例的一个引用 
  9. * ::操作符只能访问静态变量和静态函数 
  10. * new对象都会消耗内存 
  11. * 使用场景:最常用的地方是数据库连接.  
  12. * 使用单例模式生成一个对象后, 
  13. * 该对象可以被其它众多对象所使用.  
  14. */ 
  15. class Example 
  16. //保存例实例在此属性中 
  17. private static $_instance
  18. //构造函数声明为private,防止直接创建对象 
  19. private function __construct() 
  20. echo 'I am Construceted'
  21. //单例方法 
  22. public static function singleton() 
  23. if(!isset(self::$_instance)) 
  24. $c=__CLASS__
  25. self::$_instance=new $c
  26. return self::$_instance
  27. //阻止用户复制对象实例 
  28. public function __clone() 
  29. trigger_error('Clone is not allow' ,E_USER_ERROR); 
  30. function test() 
  31. echo("test"); 
  32. // 这个写法会出错,因为构造方法被声明为private 
  33. $test = new Example; 
  34. // 下面将得到Example类的单例对象 
  35. $test = Example::singleton(); 
  36. $test->test(); 
  37. // 复制对象将导致一个E_USER_ERROR. 
  38. $test_clone = clone $test
  39. ?> 
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生