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

为什么有些php类有一个空的init()方法?,php,yii2,Php,Yii2,例如,在Yii2框架中,yii\filters\AccessControl类从其父类yii\base\Object重写init()函数。这个对象类又有一个构造函数方法,如下所示: Class Object implements Configurable { public function __construct($config = []) { if (!empty($config)) { Yii::c

例如,在Yii2框架中,
yii\filters\AccessControl
类从其父类
yii\base\Object
重写
init()
函数。这个对象类又有一个构造函数方法,如下所示:

    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()
    {
    }
现在写这样一个空函数显然没有什么用处,除非你想用它来初始化将来可能需要的一些属性

但是
\uu construct()
方法也有同样的用途!我需要了解这个
init()
方法是如何有用的。

Yii论坛已经讨论过它。以下是Yii项目负责人:

init()的原因之一是关于对象(确切地说是组件)的生命周期

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

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

我同意你的观点,方法命名非常重要。在Yii中,init()方法意味着一个对象已经完全配置好,应该在这个方法中完成一些额外的初始化工作

以及:

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


原因很简单:他们希望你扩展这个类

所以你会这样做

class Bob extends Object {
    public function init() {
        $this->setup_something();
    }
}
因此,由于
Bob
扩展了
Object
Bob
中的方法就是被调用的方法。如果不需要初始化某些内容,只需跳过定义,基类将调用empty方法

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

class Bob extends Object {
    public function __construct($config = []) {
         $this->setup_something();
    }
}
现在,这是一个混乱的问题,因为有一些关键的东西很多人都忽略了(在这个例子中我故意忽略了):父构造函数将不会被调用(您可以通过使用
父::\u construct($config)
)。因此,通过使用一个单独的
init()
可以完全避免这种混乱。有一个显式的方法来进行您自己的设置