15

すべての PHP クラス ファイルでシングルトン パターンを使用しています。

サイトでのユーザーのアクションが、他のユーザーのアクションと競合する可能性はありますか?

たとえば、アプリケーションが稼働し、サイトに同時に複数のユーザーがいる場合、シングルトンはクラスの複数のインスタンスを防ぎ、単一のインスタンスのみを返すため、同じ PHP クラスを呼び出すことで同様のことを行います (舞台裏で)。 .

たとえば、Search.php というクラスがあり、それはシングルトン クラスです。このクラスは、Web サイトからのすべての検索クエリを処理します。複数のユーザーがサイトで同時に検索を実行している場合、作成できる Search クラスのインスタンスは 1 つだけであるため、それらのユーザーのアクションは互いに競合します。

ありがとうございました。

4

4 に答える 4

32

短い答えはノーです。

各ページ要求は一意のインスタンスとして処理され、ユーザーごとにそれらを結び付ける唯一のものはセッション Cookie です。PHP は、スクリプトを呼び出すと開始し、スクリプトが終了すると終了するアプリケーションと考えてください。状態を維持せず、本質的に他の PHP インスタンスを認識しません。

シングルトン パターンは単にクラスを設計するための方法であり、コード内の任意の場所 (グローバルなど) で呼び出すことができ、既にインスタンス化されているかどうかを気にする必要がなく、メモリに保持する必要があります。

于 2009-01-11T10:11:54.673 に答える
28

各リクエストは自己完結型であり、他のリクエストとデータを共有しません (memcache などの特定の拡張機能を使用しない限り)。したがって、アプリケーションにシングルトンがあっても、別のユーザーからの別のリクエストには影響しません。

懸念すべきことは、シングルトン パターンの使いすぎです。シングルトンはグローバルの OO バージョンであり、注意しないと奇妙なバグを引き起こす可能性があります。グローバル設定に依存しないスコープ操作を使用し、シングルトンを控えめに使用することをお勧めします。

于 2009-01-11T02:18:09.043 に答える
5

Singleton パターンは、議論の余地のあるパターンの 1 つです。批評家は、Singleton が Global State をアプリケーションに導入し、Singleton とその消費クラスを緊密に結合すると主張しています。これにより、隠れた依存関係と予期しない副作用が発生し、コードのテストと保守が困難になります。

批評家はさらに、オブジェクトがリクエスト内でのみ一意である PHP のようなシェアード ナッシング アーキテクチャでシングルトンを使用するのは無意味であると主張します。リクエストの最初にビルダーとファクトリーのパターンを 1 回使用することで、コラボレーター オブジェクト グラフを作成する方が簡単でクリーンです。

シングルトンは、いくつかの「SOLID」OOP 設計原則とデメテルの法則にも違反しています。シングルトンはシリアル化できません。インスタンスはシングルトンの静的属性として格納されるため、サブタイプを指定することはできず (PHP 5.3 より前)、ガベージ コレクションも行われません。

于 2012-02-22T10:04:55.887 に答える
2

同意します。答えはノーです。私は現在、PHP のシングルトン パターンについて考えており、シングルトン パターンは PHP でコーディングできますが、インスタンスがリクエスト間で共有されていない (またはプロセス メモリに格納されていない) ため、実際には実装されていないと判断しました。 ASP.net、Java、Ruby on Rails などの Web サーバー環境では?) Singleton インスタンスをシリアル化してセッションに保存できますが、それでもセッション間で共有されません。PHP でシングルトン パターンを完全に実装するには、キャッシュに格納する必要があると推測します。しかし、私はまだそれを行っていないので、確信が持てません。

于 2009-03-20T17:29:34.667 に答える