PHP为什么在构造中启动数据库连接不好?

twi*_*igg 5 php object

当我遇到这段代码时,我正在阅读一篇博文:

<?php
include_once 'config.php';
class User
{
//Database connect 
public function __construct() 
{
$db = new DB_Class();
}
Run Code Online (Sandbox Code Playgroud)

在评论中有人发布了以下内容:

永远不要在构造函数中初始化db连接

但与所有评论战士一样,他们从来没有给出理由?为什么这是错误的或不好的做法?

Gor*_*don 8

构造函数不应该做任何实际的工作:

在构造函数中工作,例如:创建/初始化协作者,与其他服务进行通信以及设置自己状态的逻辑,可以删除测试所需的接口,从而强制子类/模拟继承不需要的行为.构造函数中的太多工作会阻止实例化或更改测试中的协作者.

相反,使用依赖注入并将任何协作者传递给构造函数.这将创建更容易测试的代码.当你new在ctor中的某些东西时,使用Test Double模拟/存储它会困难得多.

此外,通过注入协作者,您可以更轻松地更换具有不同实现的协作者,从而减少耦合,促进代码重用和编码,而不是具体实现.