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

    // 注册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);// 加载对应的目录
    }
时间: 2024-10-16 20:14:32

[李景山php]每天TP5-20161205|Loader.php-3的相关文章

[李景山php]每天TP5-20161203|Loader.php-1

namespace think; // 基于 最基础的 think 命名空间 use think\exception\ClassNotFoundException; // think\exception\ClassNotFoundException // 运行 未发现类 异常 class Loader {// 类加载,类     protected static $instance = [];// 受保护的 静态的 类名映射   也就是实例化了     // 类名映射     protected

[李景山php]每天TP5-20161207|Loader.php-5

/**  * 实例化(分层)模型  * @param string $name         Model名称  * @param string $layer        业务层名称  * @param bool   $appendSuffix 是否添加类名后缀  * @param string $common       公共模块名  * @return Object  * @throws ClassNotFoundException  */ public static function m

[李景山php]每天TP5-20161204|Loader.php-2

    public static function autoload($class)// 这个就加载文件     {// 自动加载 类 // 加载一个class         // 检测命名空间别名         if (!empty(self::$namespaceAlias)) {// 如果有命名空间             $namespace = dirname($class);// 通过类名 的路径 来的 命名空间             if (isset(self::$nam

[李景山php]每天TP5-20161206|Loader.php-4

// 注册composer自动加载 private static function registerComposerLoader() {// 默认没有 ,不会执行     if (is_file(VENDOR_PATH . 'composer/autoload_namespaces.php')) {         $map = require VENDOR_PATH . 'composer/autoload_namespaces.php';         foreach ($map as $

[李景山php]每天TP5-20170115|thinkphp5-Model.php-8

    /**      * 预载入关联查询 返回模型对象      * @access public      * @param Model     $result 数据对象      * @param string    $relation 关联名      * @return Model      */     public function eagerlyResult($result, $relation)     {         return $this->relation()->

[李景山php]每天TP5-20161212|App.php-2

public static function run(Request $request = null) {// thinkphp经过了 自动加载.错误接管.配置文件预设,终于开始执行了.     // 第一步:获取请求参数     is_null($request) && $request = Request::instance();     // self::$instance = new static($options); 执行了 这个 instance     // 默认 没有传入任

[李景山php]每天TP5-20170110|thinkphp5-Model.php-3

/**  * 自动写入时间戳  * @access public  * @param string         $name 时间戳字段  * @return mixed  */ protected function autoWriteTimestamp($name) {// 自动写入 时间戳     if (isset($this->type[$name])) {// 如果当期时间戳字段 拥有 类型         $type = $this->type[$name];// 获取当前字段 

[李景山php]每天TP5-20170108|thinkphp5-Model.php-1

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2016 http://thinkphp.cn All 

[李景山php]每天TP5-20161217|thinkphp5-helper.php-2

<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2016 http://thinkphp.cn All