构造函数内部的逻辑

sit*_*lge 5 php oop constructor design-patterns class

内部有逻辑是一个好主意__constructor吗?

public class someClass
{
    public function __construct()
    {
        //some logic here
    }
Run Code Online (Sandbox Code Playgroud)

到目前为止,我认为还可以。但是,此reddit评论表明相反。

ter*_*ško 4

正如 @Barry所写,原因之一与单元测试有关,但这只是副作用。

让我们考虑最坏的情况:你有一个“类”,它只有一个构造函数(你可能已经见过这样的例子)。那么......为什么它甚至被写成一个类呢?您无法更改它的状态,您无法请求它执行任何任务,并且您无法检查它是否执行了您想要的操作。您也可以使用线性文件并将其包含在内。这实在是太糟糕了

现在举一个更合理的例子:假设您有一个类,它在构造函数中进行一些验证检查,并在其中创建一个新的数据库连接。然后它还有一些用于执行各种任务的公共方法

最明显的问题是“建立新的数据库连接” - 没有办法从类外部影响或阻止此操作。新的连接将会执行谁知道会发生什么(可能会加载一些配置并尝试抛出异常)。它还构成了一个隐藏的依赖关系,如果不检查类的代码,您就没有任何指示。

代码也存在类似的问题,即对传递的参数进行验证和/或转换。它构成了隐藏逻辑(因此违反了PoLA。它还使您的类更难以扩展,因为您可能希望保留一些验证功能,同时替换其他部分。而您没有这个选择。因为所有这些每当您创建新实例时,代码就会运行。

底线是——构造函数中的逻辑被认为是“代码味道”。这不是致命的罪过(就像eval()在全局变量上使用一样),但它是糟糕设计的标志。