我在线查看了parent :: init()的含义; 。我能找到的只是init()是初始化每次运行应用程序时想要出现的一些设置。 任何人都可以在准确的意义上解释parent :: init()的含义,就像这两个词的意义一样? 在此先感谢。(如果它太简单,我很抱歉!)
答案 0 :(得分:2)
当我们使用parent::init()
时,我们只是在当前类的方法中调用父方法(在本例中为init()
)。
关于parent ::
例如,假设我们有一个名为MyClass
的类。这个类有一个很棒的方法,可以运行很多东西:
class MyClass
{
public function runStuffs()
{
// trigger events, configure external stuff, adding default values to properties.
}
}
现在,经过一段时间,我们决定创建一个从第一个扩展的新类。我们打电话给MySecondClass
:
class MySecondClass extends MyClass
{
}
它已经有方法runStuffs()
,但是,对于第二个类,我们需要在这个方法中做更多的事情,但要保持它拥有的东西。
当然,我们可以重写整个方法,只需复制并粘贴MyClass
中的内容并添加新内容即可。但这不是优雅甚至是一种好的做法。如果稍后我们更改了MyClass
中的方法,您可能希望MysecondClass
也有更改。
因此,要解决该问题,我们可以在编写新内容之前调用父方法:
class MySecondClass extends MyClass
{
public function runStuffs()
{
parent::runStuffs();
// do more things!
}
}
现在MySecondClass->runStuffs()
将始终做它的父母做的事情,之后更多的东西。
关于init()方法。
init()是Yii2框架中几乎所有类中使用的方法(因为大部分时间都是从yii\base\Object
扩展)并且就像__constructor()方法一样工作(来自{{ {1}})。但是存在一些差异,您可以阅读更多here。
实际上PHP
方法会调用init()
方法,框架会尽可能使用__constructor()
代替init()
。
现在如果两者几乎完全相同,为什么他们创建这个方法呢?有here的答案。 (看看qiang的回答,来自开发团队):
init()的原因之一是关于对象(或准确的组件)的生命周期。
使用init()方法,可以在完全初始化之前实例化对象后对其进行配置。例如,可以使用app config配置应用程序组件。如果覆盖其init()方法,您将确保应用了配置,并且可以安全地检查是否所有内容都已准备就绪。类似的事情发生在小部件和其他可配置的组件上。
即使在构造函数而不是另一个对象中调用init(),它也有意义。例如,在CApplication中,有preInit()和init()。它们设置应用程序的生命周期,并且可以被覆盖,以便定制仅在预期的生命周期中发生。
<强>结论强>
因此,当您使用__construct()
方法并调用init()
时,您只是说要向该方法添加更多内容而不删除它已在执行的操作。
答案 1 :(得分:1)
parent::init();
方法对于在每个控制器和操作之前执行代码非常有用,
使用init()方法,可以在完全初始化之前实例化对象后对其进行配置。 例如,可以使用app config配置应用程序组件。 如果覆盖其init()方法,您将确保应用了配置,并且可以安全地检查是否所有内容都已准备就绪。 类似的事情发生在小部件和其他可配置的组件上。
在Yii中,init()方法意味着对象已经完全配置,并且应该在此方法中进行一些额外的初始化工作。
有关更多信息,请查看此链接:
https://stackoverflow.com/questions/27180059/execute-my-code-before-any-action-of-any-controller
Execute my code before any action of any controller
可能对您有所帮助。