我是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框架中,调用父构造函数的建议也是最后一个吗?

希望不要引发基于意见的讨论,所以请引用官方参考资料,指向其他项目的官方文件等.

推荐答案

@michal-hynčica正确地陈述了你模棱两可的原因(值得一提)<但是既然你提到了官方参考,在同一页(BaseObject),这个问题被明确指出:line

  • 为了确保上述生命周期,如果BaseObject的子类需要重写构造函数,
  • ....
  • 并且父实现应该在构造函数的末尾调用.

根据这篇文章的描述(类似于你的问题):

Php相关问答推荐

提交表格后的重定向不起作用

如何使用PHP停止foreach循环中的重复项?

基于验证动态更改输入字段类(名称密码)&

如何在Woocommerce中禁用机器人添加到推车?

在ShipStation for WooCommerce中使用自定义订单项目元数据

如何让PHP变量跨越多个脚本调用?

首先在WooCommerce我的帐户订单页面中移动操作按钮

在PHP中处理Linux输入事件(/dev/input/Event*)

PHP -将字符串拆分为两个相等的部分,但第二个字符串中的单词更多

PHP -流加密启用服务器切断字节

登录后重定向在WooCommerce中购买产品的用户

HTTPPost请求在从php脚本调用时返回404,但在从node.js脚本调用时有效.终结点有效

PHP 中使用 JSON 的自定义会话处理程序会因错误而 destruct 会话

自定义主键值未正确显示

如何使用相同的变量使函数参数对于数组和字符串都是可选的

Shopware 6:无法在新的自定义插件中保存关联字段(媒体)

PHP 自动函数参数和变量

NetBeans 不显示中文内容

如何在 Laravel 中验证多个输入?

我想更新表格中的结果并将它们发布到浏览器,但它不起作用