私は、このUserクラスさて、今私は私のistanceの参照を格納する必要がある場合には(我々は、単一のHTTP要求のために話をしているので、もちろん)私は1つの以上のユーザーログインを持つことはできません考慮Userクラスの一意のインスタンスに使用するパターンはどれですか?
class User{
private $logged = false;
private $id;
public function User() {
//> Check if the user is logged in with a cookie-database and set $logged=true;
}
public function isLogged() {}
public function editPerms() {}
//> other methods
}
を持っています?
これはシングルトンが有用であろうが、これらの日、誰もがシングルトンは(静的メソッドように)悪であると言う場合です。
- http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
- http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/
$GLOBALS['currentUser'] = new User();
行うと、どこでも、それはづけしたが、私は、これはシングルトンよりも悪いと思うことができました。
どうすればいいですか?
私はを要求する必要はありません。リクエストの間にこのインスタンスを保存してください。 同じリクエスト内でフレームワーク内のこのインスタンスにアクセスする方法が必要です。
あなたは私は私のヘルパーオブジェクトのすべてのために今何をすべきかを知りたい場合は、サービスコンテナ(それは同様に悪いと考えられています)です:
function app($class) { //> Sample
static $refs = array();
if (!isset($refs[$class]))
$refs[$class] = new $class();
return $refs[$class];
}
//> usage app('User')->methods();
(IE何symfony does)なぜ
あなたはシングルトン・パターンとグローバル変数の両方が1つの要求内でのみ有効であることを、知っていますか?セッション、クッキー、ファイル、またはデータベースに格納されていないものはすべて、リクエスト間で失われます。 – KingCrunch
はい、私はそれで完璧です。ユーザーがログインしているかどうかを確認する必要があります。しかし、しないでくださいOT –
しかし、あなたの質問は絶対に意味がありません:あなたは(グローバルまたはシングルトンを介して)ユーザーを "保存"することを考えていますが、要求の間に失われる)。また不可能なことに、複数のユーザーが1回のリクエストでログインすることができます。 – KingCrunch