码迷,mamicode.com
首页 > Web开发 > 详细

[李景山php]每天TP5-20161205|Loader.php-3

时间:2016-10-06 23:19:47      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:thinkphp

    // 注册classmap
    public static function addClassMap($class, $map = ‘‘)
    {// 如果 addClassMap  类文件映射,支持 数组,或者 key value 两种方式
        if (is_array($class)) {
            self::$map = array_merge(self::$map, $class);
        } else {
            self::$map[$class] = $map;
        }
    }

    // 注册命名空间
    public static function addNamespace($namespace, $path = ‘‘)
    {// 新增 命名空间注册
        // 特点:就是 支持 key value 跟 数组 赋值方式
        if (is_array($namespace)) {// if array 如果是数组
            foreach ($namespace as $prefix => $paths) {
                self::addPsr4($prefix . ‘\\‘, rtrim($paths, DS), true);
            }
        } else {// 选择 单笔 外包
            self::addPsr4($namespace . ‘\\‘, rtrim($path, DS), true);
        }
    }

    // 添加Ps0空间
    private static function addPsr0($prefix, $paths, $prepend = false)
    {// 添加 PS0 空间,
        // 如果 没存在 prefix 里面
        // 把数据给 fallbackDirsPsr0
        // prepend 代表:是配置大于约定,还是约定大于配置,这个是个常用的手法,不错,good job!
        if (!$prefix) {// 如果没有 对应的 namespace 或者 前缀
            if ($prepend) {// 默认是  false ,传入的是 true 正常调用就是执行这个
                self::$fallbackDirsPsr0 = array_merge(
                    (array) $paths,
                    self::$fallbackDirsPsr0
                );// 充分使用了 array_merge 对于 不同位置 的 覆盖方向不一样,导致的。
            } else {
                self::$fallbackDirsPsr0 = array_merge(
                    self::$fallbackDirsPsr0,
                    (array) $paths
                );
            }

            return;// 直接返回了 不会向下执行了
            // 同样深层次支持
        }
// 如果存在 first
        // 配置 到 对应的 prefix
        $first = $prefix[0];// 如果有这个 first
        if (!isset(self::$prefixesPsr0[$first][$prefix])) {// 如果没有这个
            self::$prefixesPsr0[$first][$prefix] = (array) $paths;// 设置,然后返回

            return;// 结束
        }
        // 默认 有设置的 进行合并
        if ($prepend) {// 覆盖 or 约定
            self::$prefixesPsr0[$first][$prefix] = array_merge(
                (array) $paths,
                self::$prefixesPsr0[$first][$prefix]
            );
        } else {
            self::$prefixesPsr0[$first][$prefix] = array_merge(
                self::$prefixesPsr0[$first][$prefix],
                (array) $paths
            );
        }
    }// 就是个空间的添加

    // 添加Psr4空间
    private static function addPsr4($prefix, $paths, $prepend = false)
    {// 同样的 代码
        if (!$prefix) {
            // Register directories for the root namespace.
            // 老刘啊,这个你都抄袭的,我也是醉了,哈哈,
            if ($prepend) {
                self::$fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    self::$fallbackDirsPsr4
                );
            } else {
                self::$fallbackDirsPsr4 = array_merge(
                    self::$fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset(self::$prefixDirsPsr4[$prefix])) {// 注册 如果没有设置 这些
            // Register directories for a new namespace.
            $length = strlen($prefix);// 长度
            if (‘\\‘ !== $prefix[$length - 1]) {// 如果 尾部 不是这个
                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }
            self::$prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            self::$prefixDirsPsr4[$prefix]                = (array) $paths;
            // same like Ps0
        } elseif ($prepend) {// in this word,they said prepend or append
            // Prepend directories for an already registered namespace.
            self::$prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                self::$prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            self::$prefixDirsPsr4[$prefix] = array_merge(
                self::$prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

    // 注册命名空间别名
    public static function addNamespaceAlias($namespace, $original = ‘‘)
    {// 这个英文命名 感觉 当不当 洋不洋 啊,哈哈, 应该是register Name space Alias
        if (is_array($namespace)) {
            self::$namespaceAlias = array_merge(self::$namespaceAlias, $namespace);
        } else {
            self::$namespaceAlias[$namespace] = $original;
        }
    }
   /**
    * 使用这个自动加载函数
    * @param string $autoload
    */
    // 注册自动加载机制
    public static function register($autoload = ‘‘)
    {// 重点!重点!重点!重点!重点!重点!重点!重点!重点!重点!重点!
        // 重要的事情 说
        // 注册系统自动加载
        spl_autoload_register($autoload ?: ‘think\\Loader::autoload‘, true, true);
        // 进行 系统加载 函数 自动注册
        // 自动 加载文件 // 特点,就是 用的时候,自动加载, 优于当年的 全部加载,这个也是他宣传的按需加载!
// 如果没有 对应需要 提前加载的东西,默认的 就是 检测文件是否正确,
        // 直接使用 return include 进行
        // 通过 class 名字,按照 不同的 标准 进行 加载, 更多的国际化了,你进步了

        // 其实这个里面的 核心 技术应该是 对应  不同标准的 Ps0 跟 Ps4 标准的 路径的获取
        // 实现不同 标准下的 类文件加载
        // 这个挺关键

        // 注册命名空间定义
        self::addNamespace([
            ‘think‘    => LIB_PATH . ‘think‘ . DS,
            ‘behavior‘ => LIB_PATH . ‘behavior‘ . DS,
            ‘traits‘   => LIB_PATH . ‘traits‘ . DS,
        ]);// 如果 开始  对 命名空间 进行 配置


        // 加载类库映射文件
        if (is_file(RUNTIME_PATH . ‘classmap‘ . EXT)) {
            self::addClassMap(__include_file(RUNTIME_PATH . ‘classmap‘ . EXT));
        }// 加载 类 映射

        // Composer自动加载支持
        if (is_dir(VENDOR_PATH . ‘composer‘)) {
            self::registerComposerLoader();
        }// 注册 各种 composerLoader

        // 自动加载extend目录
        self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);// 加载对应的目录
    }


本文出自 “专注php 群号:414194301” 博客,请务必保留此出处http://jingshanls.blog.51cto.com/3357095/1858899

[李景山php]每天TP5-20161205|Loader.php-3

标签:thinkphp

原文地址:http://jingshanls.blog.51cto.com/3357095/1858899

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!