委托构造函数与方法中的工作

时间:2014-07-17 18:30:00

标签: php oop constructor initialization

我想这可能是一个愚蠢的问题,但我无法将其包裹起来。

所以我有一些看起来像这样的代码:

$process = new ProcessTree();
$process->start();

并且类processTree是:

class ProcessTree()
{
    public function __construct()
    {} //dummy constructor...
}

public function start()
{
   $this->init();
   $this->doThis();
   $this->doThat();
   //etc...
}

所以我想我的问题是关于虚拟构造函数。根据好的设计,构造函数应该不做什么?或者,start()的身体不应该在__construct()内吗?

2 个答案:

答案 0 :(得分:1)

一般来说,构造函数不应该“太多”,因为这会违反单一责任原则:构造函数的责任是准备对象以供使用,因此它的操作应限于。

当然,各种规则都会有例外。例如,PDO的构造函数初始化数据库连接,而实际上并不需要这样做。但是在PDO的背景下,这是有道理的,因为:

  • 你总是希望建立这种联系(而不是迟早)
  • 总是有可能连接不会成功(因此通过让构造函数连接并抛出失败,您可以方便地检查)
  • 如果PDO构造函数没有连接或抛出,那么所有其他方法都必须准备好做同样的事情。但是PDO的错误报告策略可以切换到返回码;在这种情况下,您将被迫在整个代码中使用“连接失败”逻辑。这将是一个非常不幸的结果,但它通过连接构造函数而一劳永逸地被阻止。

但是根据经验,只要有疑问,就不要在构造函数中做事。

答案 1 :(得分:1)

如果你真的不需要,你不需要使用构造函数。我认为将空构造函数放在最佳实践中是不行的。

您也不应该将代码从start()移动到构造函数。构造函数应该只帮助初始化对象(例如设置一些属性),如果你想做一些操作,你应该简单地运行这些方法或创建包装器方法(就像你一样)一次运行多个方法。

当然,我们不知道您在init()doThis()doThat()方法中做了什么。如果他们采取的行动总是需要使用其他对象的方法,您可以将它们移动到构造函数中,但正如我所说,我们不知道它们中的代码是什么。