在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);
有没有人可以解释上面这一行?感谢。
答案 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>
我们有强大的机会选择许多“父母”的构造函数,因为
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开发人员。祝您好运!