1. 程式人生 > >PHP 單例模式優點意義及如何實現

PHP 單例模式優點意義及如何實現

一、什麼是單例模式?

1、含義   

   作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統全域性地提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回一個引用。

2、單例模式的三個要點:

(1). 需要一個儲存類的唯一例項的靜態成員變數:
private static $_instance;  
 

(2). 建構函式和克隆函式必須宣告為私有的,防止外部程式new類從而失去單例模式的意義:
private function __construct()   
{   
    $this->_db = pg_connect('xxxx');  
}   
private function __clone()  
{  
}//覆蓋__clone()方法,禁止克隆 
 
   
(3). 必須提供一個訪問這個例項的公共的靜態方法(通常為getInstance方法),從而返回唯一例項的一個引用 
public static function getInstance()    
{    
    if(! (self::$_instance instanceof self) )   
    {    
        self::$_instance = new self();    
    }  
    return self::$_instance;    
  
}   


二、為什麼要使用單例模式?



多數人都是從單例模式的字面上的意思來理解它的用途, 認為這是對系統資源的節省, 可以避免重複例項化, 是一種"計劃生育".   而PHP每次執行完頁面都是會從記憶體中清理掉所有的資源. 因而PHP中的單例實際每次執行都是需要重新例項化的, 這樣就失去了單例重複例項化的意義了. 單單從這個方面來說, PHP的單例的確有點讓各位失望. 但是單例僅僅只有這個功能和應用嗎? 答案是否定的,我們一起來看看。

php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作, 在使用面向物件的方式開發時(廢話), 如果使用單例模式, 則可以避免大量的new 操作消耗的資源。
如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現. 這個可以參看zend Framework的FrontController部分。
在一次頁面請求中, 便於進行除錯, 因為所有的程式碼(例如資料庫操作類db)都集中在一個類中, 我們可以在類中設定鉤子, 輸出日誌,從而避免到處var_dump, echo。

 

1、PHP缺點:        

PHP語言是一種解釋型的指令碼語言,這種執行機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個物件常駐記憶體,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在於整個應用程式的生命週期裡,變數是跨頁面級的,真正可以做到這個例項在應用程式生命週期中的唯一性。然而在PHP中,所有的變數無論是全域性變數還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重新建立新的物件,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景並需要共享同一物件資源時是非常有意義的。

2、單例模式在PHP中的應用場合:

(1)、應用程式與資料庫互動

一個應用中會存在大量的資料庫操作,比如過資料庫控制代碼來連線資料庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗記憶體資源和系統資源。

(2)、控制配置資訊

如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現.