php yii框架源码,yii2-basic 框架源码流程分析系列(1)之入口

写在开始

用了yii2框架也有一年的时间了,挺喜欢yii2的,期间也根据工作需要看过一些源码,在此写一个系列的文章,主要是剖析下yii2框架的启动流程和内部核心的一些代码,借此做下笔记回顾一下,同时也希望能给刚入门使用的基友们一些借鉴,加深对yii2的理解。yii2-basic和yii2-advanced核心部分的原理和代码基本一致,偷个懒使用简单版的yii2-basic作为剖析对象。

入口

yii2也是单入口框架,入口文件是/basic/web/index.php(/basic表示框架根目录),下面看一下代码

require(__DIR__ . '/../vendor/autoload.php'); // 加载composer的autoload

require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); // 加载Yii.php

$config = require(__DIR__ . '/../config/web.php'); //加载配置

(new yii\web\Application($config))->run(); // 开始执行

composer的autoload详细可以到composer中文文档中了解下,如果你还不了解composer这个包管理器,务必先了解下。下面继续看下Yii.php的代码

require(__DIR__ . '/BaseYii.php'); // 加载BaseYii.php

class Yii extends \yii\BaseYii{

}

spl_autoload_register(['Yii', 'autoload'], true, true); // 注册自定义autoload

Yii::$classMap = require(__DIR__ . '/classes.php'); // 加载框架的类映射文件

Yii::$container = new yii\di\Container(); // 初始化容器,yii2的container会在后面系列中说到

先看下yii2的类加载器

public static function autoload($className){

// 先在Yii::$classMap即上面的__DIR__ . '/classes.php'中找是否有对应的类映射,如果有获取对应的类文件路径并检查替换别名,关于设置和替换别名这里不再赘述

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 {

// 没有找到类文件,直接返回,会继续使用composer的autoload进行解析

return;

}

// 找到文件,include进来

include($classFile);

// 如果传进来的$className不是类、接口或trait,抛出异常

if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {

throw new UnknownClassException("Unable to find '$className' in file: $classFile. Namespace missing?");

}

}

Yii.php中创建了一个空的class Yii来继承\yii\BaseYii,同时由入口文件直接require,所以Yii类的生命周期与框架的生命周期一致,作用域全局,同时Yii也继承了一些通用的方法和全局的变量,一起来看看BaseYii中都有些什么

// 常量的定义,具有全局作用域

// 设置框架启动时间

defined('YII_BEGIN_TIME') or define('YII_BEGIN_TIME', microtime(true));

// 定义框架根目录 即yiisoft目录的路径

defined('YII2_PATH') or define('YII2_PATH', __DIR__);

// 设置是否在debug模式下运行

defined('YII_DEBUG') or define('YII_DEBUG', false);

// 设置运行环境,默认情况下是生产环境即prod,除此之外还有dev、test和staging

defined('YII_ENV') or define('YII_ENV', 'prod');

// 标志是否运行在prod环境

defined('YII_ENV_PROD') or define('YII_ENV_PROD', YII_ENV === 'prod');

// 标志是否运行在dev环境

defined('YII_ENV_DEV') or define('YII_ENV_DEV', YII_ENV === 'dev');

// 标志是否在test环境

defined('YII_ENV_TEST') or define('YII_ENV_TEST', YII_ENV === 'test');

// 标志是否允许设置error handler,默认允许

defined('YII_ENABLE_ERROR_HANDLER') or define('YII_ENABLE_ERROR_HANDLER', true);

// 对象属性的声明

// yii2内部类映射文件,用于加速autoload

public static $classMap = [];

// yii2 命令行模式和web模式下的应用实例

public static $app;

// 别名数组,初始化yii别名

public static $aliases = ['@yii' => __DIR__];

// DI容器,用于创建对象,在Yii.php中定义

public static $container;

// 对象方法

// 获取当前yii2框架的版本

public static function getVersion;

// 获取别名

public static function getAlias;

// 获取根别名

public static function getRootAlias

// 设置别名public static function setAlias

// 内部类自动加载方法自动加载方法加载方法public static function autoload

// 类构造器public static function createObject

// 获取日志实例日志实例public static function getLogger

// 设置日志对象日志对象public static function setLogger

// 四中类型的日志记录型的日志记录日志记录public static function trace

public static function error

public static function warning

public static function info

// 标记用于分析的代码块的开始和结束public static function beginProfile

public static function endProfile

// 配置对象属性对象属性public static function configure

// 获取对象的public属性,避免类内调用类内调用get_object_vars返回私有属性,增加安全性public static function getObjectVars

入口的大致流程到此就结束了,后续会再分析下createObject是如何利用DI container来创建对象实例的~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值