1.入口脚本 web/index.php
2.index.php文件分析
<?php //定义是否开启debug模式 展示调试信息 defined('YII_DEBUG') or define('YII_DEBUG', true); //定义开发模式 prod | dev | test defined('YII_ENV') or define('YII_ENV', 'dev'); //导入composer的自动加载 require(__DIR__ . '/../../vendor/autoload.php'); //导入yii框架核心类 require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php'); //导入引导程序 定义了部分别名 require(__DIR__ . '/../../common/config/bootstrap.php'); require(__DIR__ . '/../config/bootstrap.php'); //合并配置, 后面的会覆盖前面的, 作为配置参数用于实例化app $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();
3.alias别名的定义
①预定义别名
- @yii 表示Yii框架所在的目录,也是 yii\BaseYii 类文件所在的位置;
- @app 表示正在运行的应用的根目录,一般是 digpage.com/frontend ;
- @vendor 表示Composer第三方库所在目录,一般是 @app/vendor 或 @app/../vendor ;
- @bower 表示Bower第三方库所在目录,一般是 @vendor/bower ;
- @npm 表示NPM第三方库所在目录,一般是 @vendor/npm ;
- @runtime 表示正在运行的应用的运行时用于存放运行时文件的目录,一般是 @app/runtime ;
- @webroot 表示正在运行的应用的入口文件 index.php 所在的目录,一般是 @app/web;
- @web URL别名,表示当前应用的根URL,主要用于前端;
- @common 表示通用文件夹;
- @frontend 表示前台应用所在的文件夹;
- @backend 表示后台应用所在的文件夹;
- @console 表示命令行应用所在的文件夹;
②别名的定义
Yii::setAlias('@foo', $path)
Yii::getAlias('@foo')
③别名的使用场景
总结中...
4.类自动加载
①通过spl_autoload_register()注册, 压栈的效果使Yii定义的自动加载函数生效, index.php加载了Yii.php文件如下
class Yii extends \yii\BaseYii { } spl_autoload_register(['Yii', 'autoload'], true, true); Yii::$classMap = require(__DIR__ . '/classes.php'); Yii::$container = new yii\di\Container();
注册了其父类BaseYii中的autoload函数为自动加载函数, 同时定义了父类中的属性$classMap和$container
父类中的自动加载实现
public static function autoload($className) { //yii框架中使用的类从$classMap中读取 if (isset(static::$classMap[$className])) { $classFile = static::$classMap[$className]; if ($classFile[0] === '@') { $classFile = static::getAlias($classFile); } } elseif (strpos($className, '\\') !== false) { //判断存在命名空间 真尼玛机制 //通过别名的方式获取文件路径 $classFile = static::getAlias('@' . str_replace('\\', '/', $className) . '.php', false); if ($classFile === false || !is_file($classFile)) { return; } } else { return; } include($classFile);