我在网上寻找了parent :: init();的含义。 。我只能找到init()来初始化一些设置,这些设置每次在应用程序运行时都会出现。
任何人都可以准确地解释parent :: init()的含义,就像两个词的含义一样吗?
在此先谢谢您。(如果太简单,对不起!)

最佳答案

当使用parent::init()时,我们只是在当前类的方法内调用父方法(在本例中为init())。

关于父母:

例如,假设我们有一个名为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()方法(来自PHP的本机)类似。但是有一些区别,您可以阅读更多here

实际上,init()方法是在__constructor()内部调用的,框架使我们尽可能使用init()代替__construct()

现在,如果两者几乎是同一件事,为什么要创建此方法?该here有一个答案。 (看看来自开发团队的qiang的回答):


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

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

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


结论

因此,当您使用init()方法并调用parent::init()时,您只是在说要向该方法添加更多内容而不删除它已经在做的事情。

关于php - yii2-有人可以解释parent::init();的含义吗?声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37559386/

10-16 15:16