例如,在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()
方法是如何有用的。
答案 0 :(得分:5)
原因很简单:他们希望你扩展课程
所以你会做这样的事情
class Bob extends Object {
public function init() {
$this->setup_something();
}
}
因为Bob
扩展Object
,Bob
的方法就是被调用的方法。如果您不需要初始化某些内容,则跳过定义,基类将调用空方法。
这使您不必做一些可能更糟糕的事情:覆盖构造函数
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()。一旦提供受保护或公共方法,就意味着您需要在将来的版本中维护它。