php單例模式

來源:互聯網
上載者:User

1.什麼是單例模式。

單例模式是指整個應用中類只有一個對象執行個體的的設計模式。

2.為什麼要使用單例模式。

參考:

1.lamp兄弟連的文章 :http://php.lampbrother.net/html/70-1/1121.htm

2.phppan的部落格:http://www.phppan.com/2010/06/php-design-pattern-6-singleton/


PHP的一個主要應用場合就是應用程式與資料庫打交道的應用情境,所以一個應用中會存在大量的資料庫操作,比如過資料庫控制代碼來串連資料庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗記憶體資源和系統資源

【單例模式的優點】
1、對唯一執行個體的受控訪問
2、縮小命名空間 單例模式是對全域變數的一種改進。它避免了那些儲存唯一執行個體的全域變數汙染命名空間
3、允許對操作和表示的精華 單例類可以有子類。而且用這個擴充類的執行個體來配置一個應用是很容易的。你可以用你所需要的類的執行個體在運行時刻配置應用。
4、允許可變數目的執行個體(多例模式)
5、比類操作更靈活

【單例模式適用情境】
1、當類只能有一個執行個體而且客戶可以從一個眾所周知的訪問點訪問它時
2、當這個唯一執行個體應該是通過子類化可擴充的。並且使用者應該無需更改代碼就能使用一個擴充的執行個體時。

【單例模式與其它模式】
Factory 方法模式(factory method模式):單例模式使用原廠模式來提供自己的執行個體。
抽象原廠模式(abstract factory模式):抽象原廠模式可以使用單例模式,將具體工廠類設計成單例類。
建造者模式(Builder模式):建造模式可以將具體建造類設計成單例模式

3.單例模式執行個體

 3.1 test.php

<?phpclass Test{public $service;//靜態成品變數 儲存全域執行個體private static $instance = null;//用mysqli串連資料庫private static $SDB_USER = "test";private static $SDB_DBNAME="test";private static $SDB_HOST = 'localhost';private static $SDB_PASS = 'ddddYQ3ddddUxEY';//私人化建構函式,防止外界執行個體化對象private function  __construct() {$this->service = new mysqli(self::$SDB_HOST, self::$SDB_USER, self::$SDB_PASS, self::$SDB_DBNAME);}//私人化複製函數,防止外界複製對象private function  __clone(){}//靜態方法, 單例統一訪問入口public static function getInstance() {if (!isset(self::$instance) || is_null(self::$instance)) {self::$instance = new Test();}return self::$instance;}//測試方法: 列印hello,worldpublic function sayHello() {echo 'hello,world';}}

3.2 data.php

<?phprequire_once('test.php'); class TestObject {protected $test;function __construct($id=null) {$this->test = Test::getInstance();$this->test->sayHello();}}$obj = new TestObject();

運行data.php,結果:



4.PHP單例模式實現的核心要點有如下三條:
    1.    需要一個儲存類的唯一執行個體的靜態成員變數(通常為$instance私人變數)
    2.    建構函式和複製函數必須聲明為私人的,這是為了防止外部程式new類從而失去單例模式的意義
    3.    必須提供一個訪問這個執行個體的公用的靜態方法(通常為getInstance方法),從而返回唯一執行個體的一個引用
5.PHP單例模式的缺點
    眾所周知,PHP語言是一種解釋型的指令碼語言,這種運行機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言層級上沒有辦法讓某個對象常駐記憶體,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在於整個應用程式的生命週期裡,變數是跨頁面級的,真正可以做到這個執行個體在應用程式生命週期中的唯一性。然而在PHP中,所有的變數無論是全域變數還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重建立立新的對象,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以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.