学习yii2.0框架阅读代码(三)

阅读 BaseYii Yii的辅助类核心框架 别名相关

<?php

namespace yii;

//定义命名空间,昨天修改了一天。。
use yii\base\InvalidConfigException;
use yii\base\InvalidParamException;
use yii\base\UnknownClassException;
use yii\log\Logger;
use yii\di\Container;

//获取应用程序开始时间
defined(‘YII_BEGIN_TIME‘) or define(‘YII_BEGIN_TIME‘, microtime(true));

//框架安装目录
defined(‘YII2_PATH‘) or define(‘YII2_PATH‘, __DIR__);

//应用程序是否应在调试模式,默认值为false
defined(‘YII_DEBUG‘) or define(‘YII_DEBUG‘, false);

//环境的配置,默认为最终的成品环境prod
defined(‘YII_ENV‘) or define(‘YII_ENV‘, ‘prod‘);

//在生产环境中是否运行的应用程序
defined(‘YII_ENV_PROD‘) or define(‘YII_ENV_PROD‘, YII_ENV === ‘prod‘);

//在应用程序是否运行在开发环境
defined(‘YII_ENV_DEV‘) or define(‘YII_ENV_DEV‘, YII_ENV === ‘dev‘);

//在测试环境中是否运行的应用程序
defined(‘YII_ENV_TEST‘) or define(‘YII_ENV_TEST‘, YII_ENV === ‘test‘);

//这个常量定义错误处理是否应该启用,默认值为true
defined(‘YII_ENABLE_ERROR_HANDLER‘) or define(‘YII_ENABLE_ERROR_HANDLER‘, true);

//声明一个BaseYii类
class BaseYii
{
    //定义一个静态属性$classMap,赋值你个空字符串
    public static $classMap = [];

    //定义一个静态属性$app,为应用实例
    public static $app;

    //定义一个静态属性$aliases,Yii 的路径别名的 Map, 默认 @yii 指向当前目录
    public static $aliases = [‘@yii‘ => __DIR__];

    //定义一个静态属性$container,用于容器使用的依赖注入(DI)容器
    public static $container;

    //版本号
    public static function getVersion()
    {
        return ‘2.0.0‘;
    }

    //将路径别名转化为实际的路径
    public static function getAlias($alias, $throwException = true)
    {
        if (strncmp($alias, ‘@‘, 1)) {
        // 如果 $alias 不是以 ‘@‘ 开头的,就不是一个 Yii 的别名
            return $alias;
        }
        // 获取 / 在 $alias 中首次出现的位置
        $pos = strpos($alias, ‘/‘);
        // 如果 / 不存在,$root 就是整个 $alias,否则就是 $alias 中 / 前的内容
        $root = $pos === false ? $alias : substr($alias, 0, $pos);

        //判断$root是否存在
        if (isset(static::$aliases[$root])) {

       //如果 $root 对应的别名是一个字符串,之直接返回 $aliases[$root] 或者 $aliases[$root] . substr($alias, $pos)
            if (is_string(static::$aliases[$root])) {
                return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos);
            } else {

                 //否则,要遍历整个 $aliases[$root] 数组,找到 $name 与 $alias 相同的值,返回 $path . substr($alias, strlen($name))
                 // 其实是返回了 $path 拼接上 $alias 除去 $root 后,剩下的字符串
                foreach (static::$aliases[$root] as $name => $path) {
                    if (strpos($alias . ‘/‘, $name . ‘/‘) === 0) {
                        return $path . substr($alias, strlen($name));
                    }
                }
            }
        }

        //如果输入的别名无效,返回false
        if ($throwException) {
            throw new InvalidParamException("Invalid path alias: $alias");
        } else {
            return false;
        }
    }

    //返回根别名的一部分,一个给定的别名
    //根别名是已经注册别名通过[[setAlias()]]
    //如果一个给定的别名匹配多个根别名,将返回最长的一个
    public static function getRootAlias($alias)
    {
        $pos = strpos($alias, ‘/‘);
        $root = $pos === false ? $alias : substr($alias, 0, $pos);

        //判断$root是否存在
        if (isset(static::$aliases[$root])) {
            //同上
            if (is_string(static::$aliases[$root])) {
                return $root;
            } else {
                //同上
                foreach (static::$aliases[$root] as $name => $path) {
                    if (strpos($alias . ‘/‘, $name . ‘/‘) === 0) {
                        return $name;
                    }
                }
            }
        }

        return false;
    }
//-------------------------------------------------------------未完待续
时间: 2024-12-28 15:20:16

学习yii2.0框架阅读代码(三)的相关文章

学习yii2.0框架阅读代码(四)

阅读 BaseYii Yii的辅助类核心框架 别名相关(续) //用一个真实的路径注册一个别名 public static function setAlias($alias, $path) { if (strncmp($alias, '@', 1)) { // 如果不是以 @ 开头,就将 @ 拼到开头 $alias = '@' . $alias; } // 获取 / 在 $alias 中首次出现的位置 $pos = strpos($alias, '/'); // 如果 / 不存在,$root 就

学习yii2.0框架阅读代码(十七)

vendor/yiisoft/yii2/base/Module. 模块类 每个模块都有一个继承yii\base\Module的模块类,该类文件直接放在模块的yii\base\Module::basePath目录下, 并且能被自动加载.当一个模块被访问,和应用主题实例类似会创建该模块类唯一实例,模块实例用来帮模块内代码共享数据和组件 class Module extends ServiceLocator { /** * @event 在执行ActionEvent方法时触发事件 * 你可以设置[[A

学习yii2.0框架阅读代码(十三)

组件(Component) 组件是 Yii 应用的主要基石.是 yii\base\Component 类或其子类的实例.三个用以区分它和其它类的主要功能有: 属性(Property) 事件(Event) 行为(Behavior) 或单独使用,或彼此配合,这些功能的应用让 Yii 的类变得更加灵活和易用.以小部件 yii\jui\DatePicker 来举例,这是个方便你在 视图 中生成一个交互式日期选择器的 UI 组件: use yii\jui\DatePicker; echo DatePick

学习yii2.0框架阅读代码(十二)

先把Object.Component.Module三个核心搞清楚了在写实例 下面介绍一下Object -- Yii最基础的类,大多数类都继承了该类.常用的12个公共方法,有点类似于ThinkPHP里面的魔术方法. <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/

学习yii2.0框架阅读代码(十一)

vendor/yiisoft/yii2/base/Module. php(续) /** * 该方法解析指定的路线和创建相应的子模块(s),控制器和行动 * This method parses the specified route and creates the corresponding child module(s), controller and action * instances. It then calls [[Controller::runAction()]] to run th

学习yii2.0框架阅读代码(十五)

行为是 yii\base\Behavior 或其子类的实例.行为,也称为mixins,可以无须改变类继承关系即可增强一个已有的 yii\base\Component 类功能.当行为附加到组件后,它将“注入”它的方法和属性到组件,然后可以像访问组件内定义的方法和属性一样访问它们.此外,行为通过组件能响应被触发的事件,从而自定义或调整组件正常执行的代码. <?php namespace yii\base; /** * 行为是所有行为类的基类. * * 一个行为可以用来增强现有的功能组件,无需修改其代

学习yii2.0框架阅读代码(七)

vendor/yiisoft/yii2/base/Model.php <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base; use Yii; use ArrayAccess; use ArrayObject; use A

学习yii2.0框架阅读代码(六)

vendor/yiisoft/yii2/base/ArrayableTrait. <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base; use Yii; use yii\helpers\ArrayHelper; use

学习yii2.0框架阅读代码(二十)

vendor/yiisoft/yii2/base/Module. php(续) /** * 新建一个控制器实例基于给定的路线. * * 路线应该是相对于这个模块.该方法实现了以下算法 * to resolve the given route: * * 1. If the route is empty, use [[defaultRoute]]; * 2. If the first segment of the route is a valid module ID as declared in [