私は自分のアプリケーションのOOP設計に関してジレンマに直面しています。authクラスをシングルトンにする必要がありますか。kohanaフレームワークとzendフレームワークは、認証クラスをシングルトンとして使用していることがわかります。認証クラスをシングルトンにすることの欠点は何ですか?長所は何ですか?また、私が構築しているアプリケーションはエンタープライズアプリケーションであり、拡張する必要があります。シングルトンの場合、認証システムも拡張できますか?
4 に答える
シングルトンの使用を避け、アプリケーションごとに 1 つのオブジェクト -> リソースに対してハードウェアに制限がある場合にのみ使用してください。シングルトンを組み込むと、認証クラスをシステム内の他の何かと交換できなくなり、スタックされます。明日、別のロジック、別の接続などを使用して認証を実装する必要があるという新しい要件を受け取る可能性があると考えてください。また、シングルトンを使用した後にシステムをテストする方法については、どのようにモックしますか??
シングルトンに行かないでください!それは美化されたオブジェクト指向の名前空間に勝るものはありません。実際、シングルトンはグローバル変数を使用するのとほぼ同じくらい悪く、グローバル関数ライブラリを使用するよりもわずかに優れています (それ自体も悪いです)。作成したオブジェクトをクラスに送信することをお勧めします。
他のオブジェクトに渡される PHP 5 オブジェクトは、デフォルトで参照によって渡されます。新しいインスタンスは作成されません (clone キーワードを使用しない限り)。これにより、あらゆる種類のセッション情報を、それを必要とする他のオブジェクトにオブジェクトとして渡すことができます。
私がお勧めできる最善の方法は、セッション固有の情報を運ぶクラス「セッション」を作成することです。このクラスを MVC オブジェクトに送信します。これにより、セッションが存在しなくてもシステムをテストできます (または、その目的のためにモックアップ状態を作成できます)。あるオブジェクトを別のオブジェクトに渡すと、それらは理想的とは言えませんが、クラスが十分にプリミティブである限り、同じクラスを使用する他のシステムまたはアプリの一部で簡単に作成できます。
また、同じリクエスト内であっても、いつでも簡単に状態またはセッションを転送できます。
PHP では、リクエストが完了すると、オブジェクトはメモリに残りません。
したがって、オブジェクトをシングルトンとして作成したとしても、すべてのリクエストにはそのクラスの独自のインスタンスがあります。
しかし、オブジェクトが単一のリクエストで複数回アクセスされている場合、違いが生じます。その場合、シングルトンには次の利点があります。
複数の冗長なインスタンスが作成されるのを防ぐため、リクエストのメモリ使用量が少なくなります。
複数のアクセスで同じデータを共有します。
例: Codeigniter の get_instance 関数はシングルトン コンセプトの実装であり、各リクエストで 1 つの Codeigniter インスタンスのみが使用されます。