web-dev-qa-db-ja.com

PHPシングルトンクラスのベストプラクティス

可能性のある複製:
シングルトンが必要なのは誰ですか

私は常にベストプラクティスに関して書いていますが、与えられたものがベストプラクティスである理由も理解したいと思います。

静的関数で作成され、スコープ解決演算子(::)でアクセスされるよりも、シングルトンクラスがインスタンス化されることを好むことを記事で読みました(残念ながら覚えていません)。要するに、検証するすべてのツールを含むクラスがある場合、要するに:

class validate {
    private function __construct(){}
    public static function email($input){
        return true;
    }
}

ガベージコレクターやメンテナンスなどの理由で、これはbad practice(または少なくとも警告)と見なされると言われました。したがって、「静的メソッドとしてのシングルトンクラス」の批判が望むのは、一度しかインスタンス化しないという100%確実なクラスをインスタンス化することです。私には、「二重の仕事」をしているように見えます。すべて準備が整っているからです。私は何が欠けていますか?

問題についての見解は何ですか?もちろんそれは生死の問題ではありませんが、オプションがあれば正しい方法でやることができます:)

51
ThinkingMonkey

シングルトンオブジェクトは、1回だけインスタンス化されるオブジェクトです。それは Singleton Pattern と同じではありません。これは(Anti-)パターンで、クラスを書く方法は1回のみインスタンス化でき、Singleton(large[〜#〜] s [〜#〜]先頭に):

「クラスのインスタンスが1つだけであることを確認し、クラスへのグローバルアクセスポイントを提供します。」

PHPに関する限り、通常はシングルトンパターンを実装する必要はありません。実際、ベストプラクティスを求めるときは、これを避ける必要があります。 、なぜなら悪い習慣だからです

さらに、ほとんどのPHPのコード例は、PHPの動作を無視するパターンの実装済みの半分です。これらの偽の実装は、パターン内。

これは何かを伝えます:多くの場合、それは必要ではありません。パターンの目的に近づかないうちに、ずさんな実装がすでに作業を行っている場合、状況に間違ったパターンが使用されて、Anti-Pattern

PHP通常、クラスにインスタンスが1つしかないことを保証する必要はまったくありません。PHPアプリケーションはそれほど複雑ではなく、たとえば、アトミックインスタンスを参照する必要のある複数のスレッドはありません)。

しばしば残されるのは、クラスインスタンスへのグローバルアクセスポイントです。これは、ほとんどのPHP開発者(mis-)がパターンを使用するためのものです。現在知られているように、 「グローバルな静的状態の標準的な問題につながります。これは、複数レベルにわたってコードを複雑にし、再利用性を低下させます。プログラマーは、コードを柔軟に使用する能力を失います。そして、プログラマーは一日中問題を解決しています。

そのため、Design Patternを適用する前に、賛否両論を評価する必要があります。最も頻繁に何らかのパターンを使用するだけでは役に立ちません。

まず第一に、クラスを作成し、アプリケーションロジックの他の部分でインスタンス化される方法とタイミングに注意して、物事が柔軟に保たれるようにします。

6
hakre

まあ、これは実際にはシングルトンではありません。シングルトンは、クラスのインスタンスが1つだけであることを保証し、Validateの単一インスタンスを取得するメソッドはここにありません。ここでのデザインは静的クラスのようです。これは、ガベージコレクター(少なくともここに配置したコード)で問題を引き起こすことはありません。これは、これが何であれメモリにロードされるためです。

2
Steve Rukuts