ホームページ  >  記事  >  バックエンド開発  >  PHPシングルトンモードの分析と実践

PHPシングルトンモードの分析と実践

WBOY
WBOYオリジナル
2016-06-13 12:09:13752ブラウズ

PHP シングルトン パターンの分析と実践

1. シングルトン パターンとは何ですか?

1. 意味???

?? シングルトン モードは、オブジェクト作成モードとして、特定のクラスのインスタンスが 1 つだけ存在することを保証し、自身をインスタンス化し、このインスタンスをシステム全体にグローバルに提供します。インスタンスのコピーは作成されませんが、シングルトン クラス内に格納されているインスタンスへの参照を返します。

2. シングルトン パターンの 3 つの重要なポイント:

(1)。クラスの一意のインスタンスを保持する静的メンバー変数が必要です:

[php]?view plaincopyprint?
?
  1. プライベート?静的? >$ _instance;???
?

(2) .? 外部プログラムが新しいクラスを作成してシングルトン モードの意味を失うことを防ぐために、コンストラクターとクローン関数をプライベートとして宣言する必要があります:
?

[php]
?view plaincopyprint??
  1. private?function?__construct()???
  2. {???
  3. ??????$this->_db?=?pg_connect('xxxx');??
  4. }???
  5. プライベート?関数?__clone()??
  6. {??
  7. }//__clone() メソッドをオーバーライドし、クローン作成を禁止します??
  8. ???

?

(3)。このインスタンスにアクセスするには、パブリック静的メソッド (通常は getInstance メソッド) を提供する必要があります。これにより、一意のインスタンスへの参照が返されます?

[php]?plaincopyprint を表示?
?
  1. public?static?function?getInstance( )????
  2. {????
  3. ????if(!?(self::$_instance?instanceof?self)?)???
  4. ??? ?{????
  5. ?????????self::$_instance?=?新規?self();????
  6. ????}??
  7. ????return?self::$_instance;??? ?
  8. ??
  9. }???




2. シングルトン モードを使用する理由

1. PHP の欠点: ??????

?????? PHP 言語はインタープリタ型スクリプト言語です。この動作メカニズムにより、各 PHP ページが解釈されて実行された後に、関連するすべてのリソースがリサイクルされます。言い換えれば、PHP には言語レベルでオブジェクトをメモリに常駐させる方法がありません。これは、たとえば Java では、ライフサイクル全体を通じて常に存在します。変数はページ間レベルであり、アプリケーションのライフサイクル内でこのインスタンスを真に一意にすることができます。ただし、PHP では、グローバル変数であろうとクラスの静的メンバーであろうと、すべての変数はページレベルです。ページが実行されるたびに、新しいオブジェクトが再確立され、ページの実行後にクリアされます。 PHP のシングルトン モードは意味がないようなので、単一のページ レベルのリクエストで複数のアプリケーション シナリオが発生し、同じオブジェクト リソースを共有する必要がある場合にのみ、PHP シングルトン モードが非常に意味があると思います。

?

2. PHP でのシングルトン パターンの適用:

(1)、アプリケーションとデータベースの相互作用

? データベースを介したデータベースへの接続など、シングルトン モードを使用すると、新しい操作のたびにメモリ リソースとシステム リソースが消費されるため、多数の新しい操作を回避できます。

(2)、制御構成情報

? システム内の特定の構成情報をグローバルに制御するためにクラスが必要な場合は、

?

3. シングルトン モードを実装するには?

1. 一般的なデータベース アクセスの例:

?view plaincopyprint ? ?
  1. ....??
  2. //データベースハンドルを初期化します??
  3. $db?=?新しい?DB(...);??
  4. ??
  5. //ユーザー情報を追加??
  6. $db->addUserInfo(.. .);??
  7. ??
  8. ......??
  9. ??
  10. //関数内でデータベースにアクセスし、ユーザー情報を検索します??
  11. 関数?getUserInfo()??
  12. {??
  13. ????$db?=?new?DB(...);/ / 新しいデータベース クラスを再度作成し、データベースとの接続を確立します ??
  14. ????$db?= ?query(....);//クエリ文に従ってデータベースにアクセスします??
  15. }??
  16. ??
  17. ?>??

?

2. データベースを操作するためにシングルトン モードを適用します:

[php]
? plaincopyprint?
?
  1. ??
  2. class?DB??????
  3. {????
  4. ????private?$_db;????
  5. ????プライベート?静的?$_instance;????
  6. ??????
  7. ????private?function?__construct(...)????
  8. ??????{????
  9. ?????????$this ->_db?=?pg_connect(...);//postgrsql????
  10. ?? ??}????
  11. ????
  12. ????プライベート? 関数?__clone()?{};??//__clone() メソッドをオーバーライドしてクローン作成を無効にします????
  13. ????
  14. ????パブリック?静的?関数 ?getInstance()??????
  15. ????{????
  16. ??? ????if(!?(self::$_instance?instanceof?self)?)?{????
  17. ?????????self::$_instance?=?新しい ?self();????
  18. ?????????}????
  19. ??????????return?self::$_instance;????
  20. ????}????
  21. ??????
  22. ??????
  23. ??
  24. ????public?function?addUserInfo(...)? ?
  25. ????{??
  26. ??
  27. ? ????
  28. ??
  29. ????}??
  30. ??
  31. ??????パブリック? function?getUserInfo(...)??
  32. ????{???
  33. ??
  34. ????}??
  35. ??
  36. }??
  37. ??
  38. //test??
  39. ??
  40. $db?=?DB::getInstance();??
  41. ??
  42. $db->addUserInfo(...);??
  43. ??
  44. $db->getUserInfo(...);??
  45. ??
  46. ??
  47. ?>??



?


3. 深い理解

?

[php] ?plaincopyprint を表示?
?
  1. class?db?{??
  2. ????public?$conn;??
  3. ????パブリック?静的?$sql;??
  4. ????パブリック?静的 ?$instance=null;??
  5. ????private?function?__construct(){??
  6. ??????????require_once(
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。