1

phpのシングルトンパターンで説明したように、classes / database.phpにシングルトンデータベースクラスがあり、Database :: getInstance()メソッドを使用してusers.phpにデータベースオブジェクトを作成してから、accounts.phpで同じ静的メソッドを呼び出しています。 (Database :: getInstance())、ここでは、users.phpで作成したインスタンスの代わりに新しいインスタンスを取得しています。私はパターンのデザインに不慣れで、少し混乱しています。

私の質問は

  1. PHPでシングルトンパターンを実現するには、永続的なオブジェクトが必要ですか?
  2. そうでない場合、アプリケーション全体で単一のインスタンスを保持するすべての方法は何ですか。
4

1 に答える 1

0

デスクトップアプリケーションは、多くの場合、持続する単一のデータベース接続を使用します。ただし、PHPおよび他のほとんどのWeb言語/フレームワークでは、これは当てはまらないはずです。単一の長期接続の代わりに、ページの読み込みごとに短期接続を使用します。アプリケーション全体を考えるのではなく、各ページの読み込みのプロセスを考えてください。PHPでは、データベースまたは$ _SESSIONまたは他の場所にデータを永続化しない限り、他のページロードは他のページを認識しません。

PHPのシングルトンパターンは、ページの読み込み中のシングルトンの1つです。最初は「ポイントは何ですか?それは単なるページの読み込み」のように見えるかもしれませんが、大規模なアプリケーションに到達すると、各ページの読み込みは重要でない操作ではないことが明らかになります。Drupalのようなシステムでは、ページの読み込みごとに数十から数百のデータベースクエリを実行できます。

ああ、そしてシングルトンパターンは悪い習慣と見なされ、後であなたを噛むでしょう。実際、すべてのアプリケーションで回避する必要があります。より良いパターンは、DAOパターンやファクトリパターンのようなものです。どうか、自分を救い、シングルトンを使用しないでください(私は何度もその間違いを犯しました)。

ページの読み込み間でオブジェクトを永続化する場合(ほとんどすべてのアプリケーションで非常に必要です)、それがデータベースと$_SESSION変数の目的です。APC(http://php.net/manual/en/book.apc.php )のような代替のキャッシュオプションを使用することもできます)。アプリケーションは、データベースで見つかったものに基づいて、必要なものを再構築できる必要があります。たとえば、ユーザーが作成されます。そのユーザーのデータをデータベースに永続化します。誰かがやって来てユーザーについて知りたいときはいつでも、それをデータベースから引き出してユーザーオブジェクトを再作成します。もう1つの例は、ユーザーがログインしたままにすることです。そのため、ユーザーがログインしているかどうか、および誰としてログインしているかを確認するために、ページの読み込みごとにチェックされる$_SESSIONに何らかの変数を保持します。いくつかのチェックを行ってから、データベースからログインしているとユーザーが言っていることをユーザーにロードします。

于 2013-02-28T15:17:02.750 に答える