最近、PHPアプリケーションで依存性注入(DI)を使用する利点について学びました。ただし、依存関係のコンテナを作成する方法や、構築しているオンラインフォーラムでDIを使用する必要があるかどうかはまだわかりません。
次のコードは、ここから学んだ例に基づいて作成したDIコンテナーのバージョンです。
class ioc {
var $db;
var $session;
var $user_id;
static function newUser(static::$db, static::$user_id) {
$user = new User($db, $user_id);
return $user;
}
static function newLogin(static::$db, static::$session) {
$login = new Login($db, $session);
return $login;
}
}
$user = ioc::newUser();
$login = ioc::newLogin();
少し質問があります:
1)$ database、$ sessionなど、注入された依存関係をどこでインスタンス化する必要がありますか?コンテナクラスの外部にあるのでしょうか、それともコンテナのコンストラクタの内部にあるのでしょうか。
2)他のクラス内にUserクラスの複数のインスタンスを作成する必要がある場合はどうなりますか?以前にインスタンス化された$userオブジェクトはすでに使用されているため、そのオブジェクトを挿入できません。ただし、別のクラス内に複数のUserインスタンスを作成すると、DIのルールに違反します。例えば:
class Users {
function __construct($db, $user_id) {
$this->db = $db;
$this->user_id = $user_id;
}
function create_friends_list() {
$st = $this->$db->prepare("SELECT user_id FROM friends WHERE user_id = $this->user_id");
$st->execute();
while($row = $st->fetch()) {
$friend = ioc::newUser($row['user_id']);
$friend->get_user_name();
$friend->get_profile_picture();
}
}
}
3)以前のコードをすべて書き直さなければならないことを知っているので、DIを採用するべきかどうか疑問に思っています。以前は、すべてのファイルに含まれているinitialize.phpでインスタンス化するグローバル変数に依存していました。
DIは多くのオーバーヘッドを生み出し、使用できない状況があります(私の#2の例のように)。次のサイトは、DIを使用しない多くの正当な理由を挙げている開発者からのものです。彼の議論には何かメリットがありますか?それとも私はDIを間違って使用していますか? このリンクを確認してください。