php應用數據庫連接中的單例模式


所謂的單例模式簡而言之就是某個類在運行過程中只有一個實例,並且能夠自行實例化並為整個系統的運行提供這個實例。在數據庫連接中使用單例模式實例化數據庫連接對象主要是可以避免重復的實例化對象而造成資源的浪費。

php實現數據庫連接對象單例模式主要包括三點:

1 需要一個保存類的唯一實例靜態成員變量,一般為$_instance private變量;

private $_instance;

2 構造函數和克隆函數必須聲明為私有,防止被外部實例化類;

private function __construct{

}

private function __clone(){

}

3 必須提供一個訪問這個實例的公共靜態方法,一般為getInstance方法,且返回一個實例的引用;

static public function getInstance(){

  if(is_null(self::$_instance) || !isset(self::$_instance)){

     self::$_instance = new DB();

  }

   return self::$_instance;

}

使用單例模式最大的目的主要是實現應用中只有一個類的實例,在java或者.net這些編譯型的語言是可以保證這個唯一的實例常駐在內存中,並持續到整個應用程序生命周期的結束,但是在php這種解釋型的語言中,由於這種運行機制使得每個PHP頁面被解釋執行后,所有的相關資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內存,所有的變量無論是全局變量還是類的靜態成員,都是頁面級的(不是應用級別的),每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式只是在單次頁面級請求時出現多個應用場景並需要共享同一對象資源時體現出優勢。

不過話又說回來,對於java等編譯型語言,單例可以常駐內存並被整個應用復用,但是在高並發的情況下,是否會出現使用上的問題呢?因為每個請求都是使用同一個實例,肯定會存在調用上的問題的,因此,對於多用戶java系統,數據庫實例設計為單例模式是有問題的,存在一個排隊的問題,可以由數據庫引擎自行解決。因此,在php中使用單例模式對於任何系統都是有優勢的,因為php的語言特點決定這個單例只是頁面級別的,當頁面的php代碼執行完畢之后就會被自動釋放,對於一個頁面有多個數據庫使用的場景來說,是可以很好的節約資源,從提高系統的性能。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM