php - 构造函数内部的逻辑

标签 php class oop design-patterns constructor

__constructor 中包含逻辑是个好主意吗?

public class someClass
{
    public function __construct()
    {
        //some logic here
    }

到目前为止,我认为这很好;然而,this reddit comment提出相反的建议。

最佳答案

作为@Barry wrote ,其中一个原因与单元测试有关,但这只是一个副作用。

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

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

最明显的问题是“建立新的数据库连接”——无法从类外部影响或阻止此操作。那个新的连接将开始做谁知道的事情(可能加载一些配置并试图抛出异常)。它还构成了一个隐藏的依赖项,如果不检查该类的代码,您将没有任何迹象。

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

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

关于php - 构造函数内部的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37144937/

相关文章:

Python:为什么 Tkinter 类实例化必须使用框架?

php - SonataMediaBundle - 如何使用自定义文件输入

php - 基于 C++ 代码在 PHP 中创建字节数据并将其传递到套接字

php - Zend Db 表双连接

python - 被属性遮蔽时修改类 __dict__

java - 这段代码是否违反开闭原则?

javascript - Laravel 5.6,如何从一个函数返回两个 View

java - Tomcat 6 : Importing utility class from WEB-INF/classes

ruby-on-rails - 一个大对象还是一个小加一个大信息对象?

php $this->view->$someVar 可能吗?