标签: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