yii2初探-程序启动流程

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 表示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);

你可能感兴趣的:(php-yii2)