在函数PHP中实例化类是一种不好的做法

Nic*_*ars 3 php class function

我正在重构大量代码以使其更具可测试性,并且我有一堆依赖于实例化数据库对象的有用函数。

这样的事情:

function id_from_name($table, $name)
{
    $db = get_database();
    //code that returns an id
}

function username_from_user_id($id)
{
    $db = get_database();
    //code that returns a username
}
Run Code Online (Sandbox Code Playgroud)

还有更多类似id_exists,id_active等的信息。

现在,我认为这不是正确的选择,因为对象可能应该作为参数传递?但这意味着每次我要使用一个函数时,都要在每个函数中创建并发送一个新对象。

所以,我的问题确实是:我是否应该将这些函数移入可以访问数据库对象的自己的类/库中?我上面显示的示例通常是一种不好的处理方式吗?

Mat*_*hew 5

确实,更好的方法是上课。您将把数据库对象传递给构造函数,并使其成为实例变量。这样,每个函数都可以访问数据库对象。

现在,为什么在每个函数中实例化数据库对象之所以被认为很糟糕,是因为,例如,如果您决定一天更改数据源,则可能需要进行大量重构。如果将数据库对象传递给构造函数,则只需将正确的对象传递/注入到类中,而无需任何重构。

...有关DI的更多信息...

通过将您的对象传递给构造函数,您还可以创建更清晰的API =>,您知道哪个对象依赖于另一个,您确切知道哪个类在使用DB对象。如果您像在函数中那样开始实例化或以静态方式访问它,我将不得不浏览所有类以查看在何处使用DB对象。还有一点,依赖注入会强制SRP(单一责任原则)=>如果您开始注入太多的对象(构造函数有很多参数),您应该怀疑您的类做得比应做的要多,然后开始重构。