yii2 - 有人可以解释parent :: init()的含义吗?声明

时间:2016-06-01 04:22:25

标签: php yii2

我在线查看了parent :: init()的含义; 。我能找到的只是init()是初始化每次运行应用程序时想要出现的一些设置。 任何人都可以在准确的意义上解释parent :: init()的含义,就像这两个词的意义一样? 在此先感谢。(如果它太简单,我很抱歉!)

2 个答案:

答案 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

可能对您有所帮助。