この状況では、Inversion of Control コンテナーを使用します。
ファサード クラスから始めます。
class IoC
{
private static $container;
public static function Initialize ( IContainer $Container )
{
self::$container = $Container;
}
public static function Resolve( $type, array $parameters = array() )
{
return self::$container->Resolve( $type, $parameters );
}
}
次に、ブートストラップ担当者として、依存性注入コンテナーを使用してファサード クラスを初期化します。
$container = new Container();
$container->Register( 'Logger', function() { return new Logger('somefile.log'); } );
IoC::Initialize ( $container );
次に、コードのどこかで、オブジェクトを取得したい場合:
$log = IoC::Resolve( 'Logger' );
このアプローチを使用することで、依存性注入コンテナーの実装方法を完全に自由にできます。アプリケーションのコードを壊すことなく、どのような方法でも変更できます。
新しいコンテナーを作成するだけで、すべての静的要素を使用せずにコンテナーをテストできます。