我是Yi2新手,在很长一段时间后回到PHP开发.我有丰富的Java开发背景.我在docs for ActiveRecord强中偶然发现了这个建议:
100公共方法
Defined in:yii\base\BaseObject::_construct()
Constructor.
默认实现有两个功能:
- 使用给定的配置
$config
初始化对象.- 调用init().
如果此方法在子类中被重写,建议
- 构造函数的最后一个参数是配置数组,如
- 在测试结束时调用parent实现
我的问题是关于最后一句话:
调用构造函数末尾的parent实现.
作为一名Java开发人员,我觉得这个建议很奇怪.在Java中,不仅建议在重写构造函数的第一次调用时调用父构造函数,甚至还强制这样做,而且实际上不可能以任何其他方式进行.首先隐式调用父构造函数,或者,如果进行显式调用,它必须是方法中的第一条语句.这是由编译器强制执行的.
理论上,这对我来说很有意义.因为只要不调用父构造函数,父类就没有机会初始化,所以在调用父构造函数之前在构造函数中编写的任何代码都将使用半初始化的对象.
看看我找到的一些答案,他们似乎违背了官方文件中的建议,在自己的自定义逻辑之前致电parent::__construct
,正如我所料.例如,问题How can I create a constructor in a Yii2 model中的the accepted answer显示了一个示例,其中他们首先呼叫家长:
function __construct()
{
parent::__construct();
...
}
在同一个问题上,Another answer分符合官方文件的建议,得0分:
public function __construct($config = []) {
// your init code here
// ...
parent::__construct();
}
看看phptutorial上的the article about calling the parent constructor.net中,他们展示了一个示例,在该示例中,他们首先调用父对象,正如我所料:
class SavingAccount extends BankAccount
{
private $interestRate;
public function __construct($balance, $interestRate)
{
parent::__construct($balance);
$this->interestRate = $interestRate;
}
// ...
}
正如我所说,我的PHP已经过时了,我是Yii2 n00b,所以我希望在阅读了几个小时的文档、教程等帖子后,能在这里得到一些关于戒烟基本原理的澄清.这项调查是由看到构造函数在我继承并正在处理的代码库中的第一个和最后一个调用非常不一致而引发的.
在PHP中,是否有关于何时调用父构造函数的官方建议?
在其他PHP框架中,调用父构造函数的建议也是最后一个吗?
希望不要引发基于意见的讨论,所以请引用官方参考资料,指向其他项目的官方文件等.