gpt4 book ai didi

php - 依赖注入(inject)——传一个完整的类好还是传一个类名好?

转载 作者:可可西里 更新时间:2023-10-31 22:07:14 27 4
gpt4 key购买 nike

对于依赖注入(inject),我知道我必须将一个类的实例传递给主实例而不是主类创建它自己的实例,就像这样 (php):

class Class_One {
protected $_other;
public function setOtherClass( An_Interface $other_class ) {
$this->_other_class = $other_class;
}
public function doWhateverYouHaveToDoWithTheOtherClass() {
$this->_other_class->doYourThing();
}
}

interface An_Interface {
public function doYourThing();
}

class Class_Two implements An_Interface {
public function doYourThing() { }
}

class Class_Three implements An_Interface {
public function doYourThing() { }
}


// Implementation:
$class_one = new Class_One();
$class_two = new Class_Two();
$class_three = new Class_Three();
$class_one->setOtherClass( $class_two );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();
$class_one->setOtherClass( $class_three );
$class_one->doWhateverYouHaveToDoWithTheOtherClass();

这一切都很好。我知道,由于 Class_Two 和 Class_Three 都实现了 An_Interface,因此它们可以在 Class_One 中互换使用。 Class_One 不会知道它们之间的区别。

我的问题是,与其将实例传递给 setOtherClass,不如传递诸如“Class_Two”的字符串,并让 Class_One 的 setOtherClass 方法实际创建实例本身,这样是否是一个好主意:

class Class_One {
...
public function setOtherClass( $other_class_name ) {
$this->_other_class = new $other_class_name();
}
...
}

这种做法是否违背了依赖注入(inject)的目的,或者这是否完全有效?我认为这种类型的设置可能会帮助我进行配置,用户可以在其中指定他想早先在字符串中使用的类,稍后可以将其传递给 Class_One..

实际上,写出来让我觉得这可能不是一个好的解决方案,但我仍然会发布这个,以防有人能给我一些好的反馈,告诉我为什么我应该/不应该这样做。

谢谢 =)

瑞安

最佳答案

这在理论上违背了依赖注入(inject)的目的;你告诉 Class_One,它依赖于 An_Interface,它应该实例化该接口(interface)的具体实现。这需要 Class_One 知道如何实例化任何 An_Interface 实现,将 Class_One 与所有 An_Interface 实现紧密耦合。如果你添加一个新的 An_Interface Class_Four,你必须返回并告诉 Class_One 如何实例化一个 Class_Four。

在 PHP 中,只要所有 An_Interface 实现都具有无参数构造函数,您就可以摆脱这种情况。但是,如果任何实现都需要注入(inject)其他依赖项,那你就完蛋了;如果 Class_Four 需要一个 Class_Five 而 Class_One 不知道,你不能告诉 Class_One 只创建一个 Class_Four。

关于php - 依赖注入(inject)——传一个完整的类好还是传一个类名好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5020424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com