为什么有些php类有一个空的init()方法?

时间:2016-01-11 13:40:23

标签: php yii2

例如,在Yii2框架中,$match = preg_match('~-\K(?:[^.]*\.){2}[^.]*~', $str); 类会覆盖其父类yii\filters\AccessControl中的init()函数。这个Object类又有一个像这样的构造函数方法:

yii\base\Object

现在没有明显的使用编写这样一个空函数,除非你想用它来初始化他/她将来可能需要的一些属性。

但是 Class Object implements Configurable { public function __construct($config = []) { if (!empty($config)) { Yii::configure($this, $config); } $this->init(); // calls the method defined below } } // and the definition of this init function ... public function init() { } 方法的用法完全相同!我需要了解这种__construct()方法是如何有用的。

2 个答案:

答案 0 :(得分:5)

原因很简单:他们希望你扩展课程

所以你会做这样的事情

class Bob extends Object {
    public function init() {
        $this->setup_something();
    }
}

因为Bob扩展ObjectBob的方法就是被调用的方法。如果您不需要初始化某些内容,则跳过定义,基类将调用空方法。

这使您不必做一些可能更糟糕的事情:覆盖构造函数

class Bob extends Object {
    public function __construct($config = []) {
         $this->setup_something();
    }
}

现在,这很麻烦,因为很多人都错过了一些关键的东西(我故意省略了这个例子):父构造函数不会被调用(你可以通过{ {1}})。因此,通过单独parent::__construct($config),您可以完全避免混乱。有一种明确的方法可以进行自己的设置。

答案 1 :(得分:3)

在Yii论坛上已经讨论过at length。这是Yii项目负责人:

  

init()的原因之一是关于对象(或准确的组件)的生命周期。

     

使用init()方法,可以在完全初始化之前实例化对象后对其进行配置。例如,可以使用app config配置应用程序组件。如果覆盖其init()方法,您将确保应用了配置,并且可以安全地检查是否所有内容都已准备就绪。类似的事情发生在小部件和其他可配置的组件上。

     

即使在构造函数而不是另一个对象中调用init(),它也有意义。例如,在CApplication中,有preInit()和init()。它们设置应用程序的生命周期,并且可以被覆盖,以便定制仅在预期的生命周期中发生。

     

我同意你的意思,方法命名非常重要。在Yii中,init()方法意味着对象已经完全配置,并且应该在此方法中进行一些额外的初始化工作。

  

每个功能都应该存在。在Yii的情况下,init()方法主要用于允许在组件的特定生命周期进行定制。在您的日历应用程序中,您可能需要也可能不需要init()。如果您打算将其发布供公众使用,我建议您在允许自定义方面更加保守。也就是说,除非你有充分的理由,否则不要定义init()。一旦提供受保护或公共方法,就意味着您需要在将来的版本中维护它。