7

任意のコードがアクセスできるメイン クラスを持つ場合、いくつかのコードは似ていますが、動的クラスをロードするベスト プラクティスがありますか?

候補コード:

static public function __callStatic($mtd,$arg){

    // using spl_autoload_register()
    $class = '\\framework\\libs\\'.$mtd;  

    $inst = new $class($arg);

}

構文:

main::dinamicu($data);
4

2 に答える 2

2

この状況では、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' );

このアプローチを使用することで、依存性注入コンテナーの実装方法を完全に自由にできます。アプリケーションのコードを壊すことなく、どのような方法でも変更できます。

新しいコンテナーを作成するだけで、すべての静的要素を使用せずにコンテナーをテストできます。

于 2012-09-02T17:58:29.460 に答える
0

私の2セント:

「ベストプラクティス」について言及したので、サービスロケーターパターン(これはあなたのmain::dinamicu($data);)に似たものについて話していると仮定すると、テスト駆動開発である場合、これは適切なパターンではないと主張する人もいます。サービスロケーターの代わりに、依存性注入コンテナーが最適です。

ファクトリクラスと同様のいくつかの方法で、コンテナはクラスのインスタンス化を処理します。オブジェクトの作成を処理する方法について明確なアイデアを取得し、例を確認するには、以下の例(Symfonyサービスコンテナー)を参照してください。

http://fabien.potencier.org/article/13/introduction-to-the-symfony-service-container

(symfonyサービスコンテナーは、依存性注入コンテナーを採用しているにもかかわらず、投稿したコードのように、コントローラーのサービスロケーターとして引き続き使用されます)

于 2012-08-13T11:18:52.573 に答える