日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > php設計模式實例之單例模式

php設計模式實例之單例模式

來源:程序員人生   發布時間:2013-11-02 10:29:41 閱讀次數:2790次

本文章來給大家介紹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. ?> 
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成人永久aaa | 中文久久乱码一区二区 | 欧洲视频一区二区 | 中文有码在线视频 | 超碰久热| 免费av看| 精品视频在线观看 | 久久精品a | 亚洲精品大全 | 亚洲欧美日韩在线不卡 | 99在线视频免费观看 | 波多野结衣av电影 | 综合久久狠狠色成人网 | 日韩一区二区免费视频 | 久久久久久黄 | 日韩欧美一区二区三区久久婷婷 | 久久久精品综合 | 91蜜桃婷婷狠狠久久综合9色 | 99精品国产一区二区 | 亚洲高清成人 | 欧美精品不卡 | 久久99色| 男女午夜视频在线观看 | 日韩精品一区在线观看 | 精品1区2区 | 亚洲经典三级 | 一区三区视频在线观看 | 精品欧美一区二区三区 | 国产一区二区精品久久 | 中文字字幕一区二区三区四区五区 | 91网站免费观看 | 国产黄色在线看 | 亚洲国产精品99久久久久久久久 | 日韩精品免费在线观看 | 国产精品成人a免费观看 | 精品久久一区二区 | 亚洲午夜精品视频 | 99久久精品国产免费看不卡 | 免费网站观看www在线观 | 国产成人精品一区二区在线 | 成人在线一区二区三区 |