PHP單例模式

來源:互聯網
上載者:User

標籤:his   串連數   靜態成員   控制代碼   串連   特定   static   建立   相關   

一、什麼是單例模式?

1、含義   

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

 

 

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

(1)需要一個儲存類的唯一執行個體的靜態成員變數:

private static $obj;   

(2)建構函式和複製函數必須聲明為私人的,防止外部程式new類從而失去單例模式的意義:

private function __construct()   
{   
}
private function __clone()  
{  
}//覆蓋__clone()方法,禁止複製 關於clone 和  __clone 魔術方法將會在本部落格說明


(3)必須提供一個訪問這個執行個體的公用的靜態方法(通常為getInstance方法),從而返回唯一執行個體的一個引用 

public static function getInstance()    
{    
    if(!self::$obj)   
    {    
        self::$obj= new self();    
    }  
    return self::$_instance; 
}    關於self 和  $this 不理解的同學請看這裡。

http://www.cnblogs.com/moxiaoan/p/6228905.html

 

關於靜態變數與靜態方法不理解的可以看這裡。

http://www.cnblogs.com/moxiaoan/p/6228948.html


二、為什麼要使用單例模式?
1、PHP缺點:        

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

 

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

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

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

(2)控制配置資訊

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

 

 

三、如何?單例模式?

1、普通的資料庫訪問例子:

//初始化一個資料庫控制代碼  
$db = new DB(...);  

//添加使用者資訊  
$db->addUserInfo(...);  

......  

//在函數中訪問資料庫,尋找使用者資訊  
function getUserInfo()  
{  
    $db = new DB(...);//再次new 資料庫類,和資料庫建立串連  
    $db = query(....);//根據查詢語句訪問資料庫  
}  

?>  

 


2、應用單例模式對資料庫進行操作:

 

class DB    
{    
    private static $obj;    
    private function __construct(...)    
    {    
        
    }    
    private function __clone() {}; 

    public static function getInstance()    
    {    
        if(! (self::$obj instanceof self) ) {    //  instanceof使用這個關鍵字可以確定一個對象是類的執行個體、類的子類,還是實現了某個特定介面.
            self::$obj = new self();    
        }    
        return self::$obj;    
    }    

    public function addUserInfo(...)  
    {  
    }  
     public function getUserInfo(...)  
    {   
    }  

}  

//test    
$db = DB::getInstance();    
$db->addUserInfo(...);    
$db->getUserInfo(...);   

?>  

PHP單例模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.