【发布时间】:2020-07-27 14:47:12
【问题描述】:
我们都知道简单的DI:减少耦合,并启用替换对象blahblahblah:
class testA
{
public function m() {}
}
class testB
{
public function m() {}
}
class Prj
{
/**
* @var testA
*/
private $obj;
/**
*
*/
public function __construct(testA $obj)
{
// $this->obj = new testA();
$this->obj = $obj;
$this->obj->m();
}
}
$obj = new testA();
$project = new Prj($obj);
我知道$this->obj = new testA(); 引入了紧密耦合,如果我在 Prj::constructor 中完成的话。没错-“__construct(testA $obj)”不会?这也暗示需要“testA”。
以及如何更换它?这个:
$obj = new testB();
$project = new Prj($obj); // FAIL!
只是不会运行,因为它需要“testA”而不是“testB”。另一种骇人听闻的方式:
class testB extends testA
{
public function m() {}
}
工作直到“testA”不是final 或testB 需要来自其他类的inherit...所以现在“紧密耦合”似乎并没有被我消除。
如果有人说“只需删除 testA 提示”:如果我使用 Java 或其他强类型语言进行开发怎么办?
【问题讨论】:
-
听起来在测试中你想要像 test doubles 这样的东西 - PHPUnit test doubles
-
不错,但这不是重点
-
不完全确定您在问什么 - DI 更多的是在设计中构建灵活性,其他功能(作为最终功能)可以帮助您锁定某些设计决策。以数据库连接的常见用法为例——如果你在你的类中硬编码这个连接——你如何配置这个连接以使这个类使用一些特定的特性(另一个数据库、事务)?