我々は、すべての方法を知っている悪いシングルトン彼らは依存関係を非表示にするためにためている他の理由。
しかし、フレームワークでは、一度だけインスタンス化してどこからでも呼び出す必要のある多くのオブジェクト(ロガー、dbなど)が存在する可能性があります。
この問題を解決するために、サービス(ロガーなど)へのすべての参照を内部的に保存する、いわゆる「オブジェクトマネージャー」(またはsymfonyのようなサービスコンテナー)を使用するように言われました。
しかし、サービスプロバイダーが純粋なシングルトンほど悪くないのはなぜですか?
サービスプロバイダーも依存関係を隠し、最初のインスタンスの作成をラップアウトするだけです。そのため、シングルトンの代わりにサービスプロバイダーを使用する理由を理解するのに本当に苦労しています。
PS。依存関係を隠さないようにするには、DIを使用する必要があることを知っています(Miskoが述べたように)
追加
私は付け加えます:最近のシングルトンはそれほど悪ではありません、PHPUnitの作成者はここでそれを説明しました:
DI +シングルトンは問題を解決します:
<?php
class Client {
public function doSomething(Singleton $singleton = NULL){
if ($singleton === NULL) {
$singleton = Singleton::getInstance();
}
// ...
}
}
?>
これですべての問題が解決されなくても、それはかなりスマートです。
DIとService Container以外に、このヘルパーオブジェクトにアクセスするための適切なソリューションはありますか?