PHP単例モードの例と解析

5196 ワード

一、単例モードとは何ですか.
1、意味
オブジェクトの作成モードとして、単一のモードでは、クラスにインスタンスが1つしかなく、独自にインスタンス化され、システム全体にグローバルに提供されることを保証します.インスタンスのコピーは作成されず、単一のクラス内に格納されているインスタンスに参照が返されます.
2、単例モードの3つのポイント:
(1). クラスの一意のインスタンスを保存する静的メンバー変数が必要です.
private static $_instance;

(2). コンストラクション関数とクローン関数は、外部プログラムnewクラスが単一のモードの意味を失うことを防止するために、プライベートとして宣言する必要があります.
private function __construct(){
    $this->_db=pg_connect('xxoo');
}
private function clone(){}

(3). このインスタンスにアクセスする共通の静的メソッド(通常getInstanceメソッド)を提供し、一意のインスタンスの参照を返す必要があります.
public static function getInstance(){
    if(!(self::$_instance instanceof self)){
        self::$_instance=new self();
    }
    return self::$_instance;
}

二、どうして単例モードを使うのですか.1、PHPの欠点:
    php             ,          PHP        ,            。    ,PHP                   ,  asp.NET、Java        ,   Java                     ,        ,                        。   PHP ,                    ,      ,        ,          ,             ,    PHP            ,  PHP                                              。

2、単例モードのPHPでの応用場合:
(1)、アプリケーションとデータベースの相互作用
                    ,                  ,             new  ,     new               。

(2)、制御構成情報
                          ,                 .

三、どのように単例モードを実現しますか?
1.一般的なデータベースアクセス例:
...);//          
$db->addUserInfo(...);//      


//         ,      
function getUserInfo(){
    $db=new DB(...);//  new     ,        
    $db=query(...);//           
}

2、単例モードを適用してデータベースを操作する:

class DB{
    private $_db;
    private static $_instance;
    private function __construct(){
        $this->_db=pg_connect(...);
    }
    private function clone(){}
    public static function getInstance(){
        if(!(self::$_instance instanceof self)){
            self::$_instance=new self();
        }
        return self::$_instance;
    }
    publilc function addUserInfo(){}
    public function getUserInfo(){}
}
$db=DB::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);