1

Web サイトのコンポーネントをクラスに移動しようとしているところです。たとえば、以下のスニペットは複数のファイルで使用する必要がありますが、コードをコピーして貼り付けたくありません。

<?php
...
require "ActionManager.php";
require "Action.php";
require "includes/pdo.php";

$actionMan = new ActionManager();
$actionMan->setPDO($pdo);
$actionMan->setUserData($data);
echo $actionMan->getActions(3);
?>

spl_autoload_register() を使用して最初の 2 つの require を取り除くことができることはわかっていますが、私が探しているのはある種の依存関係コンテナーであると考えているため、このコードを繰り返して自分自身を台無しにすることはありません。それが変わるとき。

また、多くのクラスで setPDO() および setUserData() メソッドを繰り返していることに気づきました。

誰かが親切に私を正しい方向に向けることができますか?

4

1 に答える 1

1

ステートメントはrequireそこにあるべきではなく、代わりに依存関係を自動ロードします。Anthony Ferrara によるオートローディングのコストと利点に関する優れたブログ投稿があり、全体としてオートローディングが最適なソリューションであると結論付けています。

コードの残りの部分は、ブートストラップ コードのように見えます。の新しいインスタンスを 1 つ作成し、ActionManagersetter メソッドを介して 2 つの依存関係を注入します。これが実際に依存関係階層の最上位にあるブートストラップ コードである場合は、使用しても問題ありませんnew。私が気に入らないのは、明らかに依存関係が必要なファイルに作成され、それらのインスタンスが既に必要かどうかを言うことができないという事実です (遅延インスタンス化のオプションはありません)。

アプリケーション全体によっては、DIC の使用を検討したい場合もありますが、私はあまり好きではありません。DICなしで適切なコンストラクター注入を行うことができます。実際、ほとんどの場合、人々は DIC を誤って使用してしまい、DI が対処するはずの問題を再現してしまいます。

アーキテクチャをもっと見せていただければ、共通の依存関係を処理する方法について、より具体的なアドバイスを提供できるかもしれません。

于 2012-11-17T21:35:32.677 に答える