国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

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

2024-05-04 21:57:34
字體:
來源:轉載
供稿:網友

本文章來給大家介紹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. ?> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松江区| 鄂托克前旗| 湖北省| 武功县| 谷城县| 神木县| 凤城市| 微博| 新闻| 陇川县| 阳信县| 读书| 出国| 秭归县| 平昌县| 囊谦县| 青田县| 方正县| 津南区| 轮台县| 灵川县| 潢川县| 三台县| 阳谷县| 江阴市| 南昌县| 无锡市| 桐庐县| 莲花县| 西峡县| 从江县| 吉木乃县| 凉山| 桑植县| 兰溪市| 灵寿县| 读书| 长白| 内乡县| 巩义市| 枣阳市|