php – 依赖注入 – 传递完整的类或类的名称是否更好?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 依赖注入 – 传递完整的类或类的名称是否更好?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2031字,纯文字阅读大概需要3分钟。
内容图文
![php – 依赖注入 – 传递完整的类或类的名称是否更好?](/upload/InfoBanner/zyjiaocheng/807/ddc5f9c9da5746ba95e1aaf64666337f.jpg)
对于依赖注入,我知道我必须将一个类的实例传递给主实例而不是主类创建它自己的实例,就像这样(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();
}
...
}
这种方式是否会破坏依赖注入的目的,还是完全有效?我认为这种类型的设置可以帮助我进行配置,用户可以在之前的字符串中指定要使用的类,稍后可以将其传递给Class_One.
实际上,写出来让我觉得它可能不是一个好的解决方案,但我仍然会发布这个以防万一有人可以给我一些很好的反馈,说明为什么我应该/不应该这样做.
谢谢=)
瑞安
解决方法:
这在理论上违背了依赖注入的目的;你告诉Class_One,它取决于An_Interface,它应该实例化该接口的具体实现.这要求Class_One知道如何实例化ANY An_Interface实现,将Class_One紧密耦合到所有An_Interface实现.如果你添加一个新的An_Interface Class_Four,你必须返回并告诉Class_One如何实例化Class_Four.
在PHP中,由于所有An_Interface实现都具有无参数构造函数,因此您可以远离这一点.但是,如果任何实现需要注入其他依赖项,那么你就搞砸了;如果Class_Four需要Class_One不知道的Class_Five,你不能告诉Class_One只是新建一个Class_Four.
内容总结
以上是互联网集市为您收集整理的php – 依赖注入 – 传递完整的类或类的名称是否更好?全部内容,希望文章能够帮你解决php – 依赖注入 – 传递完整的类或类的名称是否更好?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。