我一直在阅读有关依赖注入的内容,但我发现的示例对我来说看起来像是糟糕的代码,所以我的主要问题是我认为它是糟糕的代码是正确的,还是我误解了它的目的,并且是我的例子更好吗?
class Photo {
protected $db;
public function __construct()
{
$this->db = DB::getInstance();
}
}
所以这是一个糟糕的代码,依赖注入的建议是:
class Container {
protected $db;
public static newPhoto()
{
$photo = new Photo;
$photo->setDB(static::$db);
$photo->setConfig();
$photo->setResponse();
return $photo;
}
}
$photo = Container::newPhoto();
但是,如果我错了,请纠正我,我们刚刚构建了一个类,其唯一职责是构建另一个类,这似乎毫无意义,而且我们正在使用静态方法,这显然是一个非常糟糕的主意。
我确实看到的一个好处是,令我惊讶的是没有提到我们现在可以使用设置器独立测试 Photo 类,而在第一个示例中我们不能。
这样的事情对我来说更有意义:
class Photo {
protected $db;
protected $config;
protected $response;
public function __construct($dbConn=null,$config='123',$response=true)
{
if(is_null($dbConn))
$this->db = DB::getInstance();
else
$this->db = $dbConn;
...etc
}
}
$photo = new Photo($dbConn);
该类自行构建,不需要实际调用静态方法,如果使用值,则可以使用虚拟数据测试该类,否则它会退回到默认值(这似乎是 Container 类的唯一点),与容器相比,依赖关系仍然有些明显。