首页 > 开发 > PHP > 正文

Yii2中组件的注册与创建方法

2024-05-04 22:44:58
字体:
来源:转载
供稿:网友

 今天本来打算研究一下yii2.0的AR模型的实现原理,然而,计划赶不上变化,突然就想先研究一下yii2.0的数据库组件创建的过程。通过对yii源码的学习,了解了yii组件注册与创建的过程,并发现原来yii组件注册之后并不是马上就去创建的,而是待到实际需要使用某个组件的时候再去创建对应的组件实例的。本文大概记录一下这个探索的过程。

  要了解yii组件的注册与创建,当然要从yii入口文件index.php说起了,整个文件代码如下:

<?phpdefined('YII_DEBUG') or define('YII_DEBUG', true);defined('YII_ENV') or define('YII_ENV', 'dev');require(__DIR__ . '/../../vendor/autoload.php');require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');require(__DIR__ . '/../../common/config/bootstrap.php');require(__DIR__ . '/../config/bootstrap.php');$config = yii/helpers/ArrayHelper::merge( require(__DIR__ . '/../../common/config/main.php'), require(__DIR__ . '/../../common/config/main-local.php'), require(__DIR__ . '/../config/main.php'), require(__DIR__ . '/../config/main-local.php'));(new yii/web/Application($config))->run();

可以看到入口文件引入了几个配置文件,并将所有配置文件的内容都合并到$config这个配置数组中,然后使用这个配置数组作为参数去创建一个应用实例。若将这个配置数组打印出来,就会看到,“components”下标对应的元素包含了yii组件的参数信息(这里只截图一小部分):

这些组件的信息是在引入进来的几个配置文件中配置的,Yii组件就是使用这些参数信息进行注册与创建的。

  接下来就进入yii/web/Application类的实例化过程了,yii/web/Application类没有构造函数,但是它继承了/yii/base/Application类:

所以会自动执行/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);}

这里要顺便说一下预初始化方法preInit(),它的代码如下:

public function preInit(&$config){ /* 此处省略对$config数组的预处理操作代码 */ // merge core components with custom components foreach ($this->coreComponents() as $id => $component) {  if (!isset($config['components'][$id])) {   $config['components'][$id] = $component;  } elseif (is_array($config['components'][$id]) && !isset($config['components'][$id]['class'])) {   $config['components'][$id]['class'] = $component['class'];  } }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表