1.入口脚本 web/index.php
2.index.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::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);