1. シングルトン パターンとは何ですか?
1. 意味???
?? シングルトン モードは、オブジェクト作成モードとして、特定のクラスのインスタンスが 1 つだけ存在することを保証し、自身をインスタンス化し、このインスタンスをシステム全体にグローバルに提供します。インスタンスのコピーは作成されませんが、シングルトン クラス内に格納されているインスタンスへの参照を返します。
2. シングルトン パターンの 3 つの重要なポイント:
(1)。クラスの一意のインスタンスを保持する静的メンバー変数が必要です:
- プライベート?静的? >$ _instance;???
(2) .? 外部プログラムが新しいクラスを作成してシングルトン モードの意味を失うことを防ぐために、コンストラクターとクローン関数をプライベートとして宣言する必要があります:
?
- private?function?__construct()???
- {???
- ??????$this->_db?=?pg_connect('xxxx');??
- }???
- プライベート?関数?__clone()??
- {??
- }//__clone() メソッドをオーバーライドし、クローン作成を禁止します??
- ???
?
(3)。このインスタンスにアクセスするには、パブリック静的メソッド (通常は getInstance メソッド) を提供する必要があります。これにより、一意のインスタンスへの参照が返されます?
- public?static?function?getInstance( )????
- {????
- ????if(!?(self::$_instance?instanceof?self)?)???
- ??? ?{????
- ?????????self::$_instance?=?新規?self();????
- ????}??
- ????return?self::$_instance;??? ?
- ??
- }???
2. シングルトン モードを使用する理由
1. PHP の欠点: ??????
?????? PHP 言語はインタープリタ型スクリプト言語です。この動作メカニズムにより、各 PHP ページが解釈されて実行された後に、関連するすべてのリソースがリサイクルされます。言い換えれば、PHP には言語レベルでオブジェクトをメモリに常駐させる方法がありません。これは、たとえば Java では、ライフサイクル全体を通じて常に存在します。変数はページ間レベルであり、アプリケーションのライフサイクル内でこのインスタンスを真に一意にすることができます。ただし、PHP では、グローバル変数であろうとクラスの静的メンバーであろうと、すべての変数はページレベルです。ページが実行されるたびに、新しいオブジェクトが再確立され、ページの実行後にクリアされます。 PHP のシングルトン モードは意味がないようなので、単一のページ レベルのリクエストで複数のアプリケーション シナリオが発生し、同じオブジェクト リソースを共有する必要がある場合にのみ、PHP シングルトン モードが非常に意味があると思います。
?
2. PHP でのシングルトン パターンの適用:
(1)、アプリケーションとデータベースの相互作用
? データベースを介したデータベースへの接続など、シングルトン モードを使用すると、新しい操作のたびにメモリ リソースとシステム リソースが消費されるため、多数の新しい操作を回避できます。
(2)、制御構成情報
? システム内の特定の構成情報をグローバルに制御するためにクラスが必要な場合は、
?
3. シングルトン モードを実装するには?
1. 一般的なデータベース アクセスの例:
- ....??
- //データベースハンドルを初期化します??
- $db?=?新しい?DB(...);??
- ??
- //ユーザー情報を追加??
- $db->addUserInfo(.. .);??
- ??
- ......??
- ??
- //関数内でデータベースにアクセスし、ユーザー情報を検索します??
- 関数?getUserInfo()??
- {??
- ????$db?=?new?DB(...);/ / 新しいデータベース クラスを再度作成し、データベースとの接続を確立します ??
- ????$db?= ?query(....);//クエリ文に従ってデータベースにアクセスします??
- }??
- ??
- ?>??
?
2. データベースを操作するためにシングルトン モードを適用します:
- ??
- class?DB??????
- {????
- ????private?$_db;????
- ????プライベート?静的?$_instance;????
- ??????
- ????private?function?__construct(...)????
- ??????{????
- ?????????$this ->_db?=?pg_connect(...);//postgrsql????
- ?? ??}????
- ????
- ????プライベート? 関数?__clone()?{};??//__clone() メソッドをオーバーライドしてクローン作成を無効にします????
- ????
- ????パブリック?静的?関数 ?getInstance()??????
- ????{????
- ??? ????if(!?(self::$_instance?instanceof?self)?)?{????
- ?????????self::$_instance?=?新しい ?self();????
- ?????????}????
- ??????????return?self::$_instance;????
- ????}????
- ??????
- ??????
- ??
- ????public?function?addUserInfo(...)? ?
- ????{??
- ??
- ? ????
- ??
- ????}??
- ??
- ??????パブリック? function?getUserInfo(...)??
- ????{???
- ??
- ????}??
- ??
- }??
- ??
- //test??
- ??
- $db?=?DB::getInstance();??
- ??
- $db->addUserInfo(...);??
- ??
- $db->getUserInfo(...);??
- ??
- ??
- ?>??
?
3. 深い理解
?
- class?db?{??
- ????public?$conn;??
- ????パブリック?静的?$sql;??
- ????パブリック?静的 ?$instance=null;??
- ????private?function?__construct(){??
- ??????????require_once(