什么是' Component :: __ construct($ config)'在yii \ base \ Application的构造函数中是什么意思?

时间:2017-06-18 06:37:30

标签: constructor yii2 components

yii\base\Application的构造函数中:

public function __construct($config = [])
{
    Yii::$app = $this;
    static::setInstance($this);
    $this->state = self::STATE_BEGIN;
    $this->preInit($config);
    $this->registerErrorHandler($config);

    Component::__construct($config); // <====== this line confused me
}

我不明白为什么Component::__construct($config)被放置在构造函数的末尾。

Component concept section of Yii2 Guide中,Yii建议:

  

从yii \ base \ Component或yii \ base \ Object扩展类时,建议您遵循以下约定:

     
      
  • 如果覆盖构造函数,请指定$ config参数作为构造函数的最后一个参数,然后将此参数传递给父构造函数
  •   
  • 始终在覆盖构造函数的末尾调用父构造函数。
  •   
  • 如果覆盖yii \ base \ Object :: init()方法,请确保在init()方法的开头调用init()的父实现。
  •   

在阅读了上面的前两个约定之后,我认为在yii\base\Application的构造函数的末尾,会有一行如下:

parent::__construct($config);

但最后一行是:

Component::__construct($config);

有没有人可以解释上面这一行?感谢。

1 个答案:

答案 0 :(得分:0)

我正在学习Yii2。阅读文档和框架代码。那一刻我也被偶然发现了。幸运的是我解决了雾霾。

1)是的,您对框架的哲学是正确的。你应该打电话 parent::__construct($config);用于对象的完整初始化。 但是parent一词怎么了?

2)parent是特殊的php关键字,表示最近的父类。 Php可以使用父类,因为它在放置父类的内存中具有与子指针类相连的指针。 看下面的图片和代码示例

Picture - example of simple extends

class Human
{
    public function __construct()
    {
        echo "<br><pre>";
        print_r(__METHOD__); // show Human::__construct
        echo  "</pre><br>";
    }
}

class Man extends Human
{
    public function __construct()
    {
        echo "<br><pre>";
        print_r(__METHOD__); // show Man::__construct
        echo  "</pre><br>";

        parent::__construct();
        /*
            I can write Human::__construct();
            It will work fine too!
            Why? - see corresponding picture
        */
    }
}

$someone = new Man();

所以parent::__construct();Human::__construct();相同,因为人类是人类的父母。

3)我们可以从Yii2的情况中看到哪些细节?

Application来自Module

Module来自ServiceLocator

ServiceLocator来自Component

Component来自BaseObject

BaseObject实现Configurable

您可以看到此链为Application-> Module-> ServiceLocator-> Component-> BaseObject-> Configurable < / p>

4)Look at the next picture

我们有强大的机会选择许多“父母”的构造函数,因为 php将该类的所有指针链接在一起。但是在我们的情况下 框架Yii2需要使用BaseObject __construct()方法来完成 Yii::app$this对象的初始化。我们不想配置Module或 现在SeviceLocator。因此,最好跳过层次结构中的某些父类并转到Component类。比较Module::__construct和Component类的父级BaseObject::__construct()的代码。 = =

    // Module constructor
    public function __construct($id, $parent = null, $config = [])
    {
        $this->id = $id;
        $this->module = $parent;
        parent::__construct($config);
    }

    // BaseObject constructor
    public function __construct($config = [])
    {
        if (!empty($config)) {
            Yii::configure($this, $config);
        }
        $this->init();
    }

5)我知道很多时间过去了。但我希望,我的小调查能像我一样帮助其他初级php开发人员。祝您好运!