// 注册classmappublic 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];// 如果有这个 firstif (!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 Aliasif (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);// 加载对应的目录}

转载于:https://blog.51cto.com/jingshanls/1858899

[李景山php]每天TP5-20161205|Loader.php-3相关推荐

  1. php tp5.3,[李景山php]每天TP5-20161226|thinkphp5-Console.php-3

    /** * 某个指令是否存在 * @param string $name 指令名称 * @return bool */ public function has($name) { return isse ...

  2. php tp5 parent,[李景山php]每天TP5-20161225|thinkphp5-Console.php-2

    /** * 执行指令 * @param Input  $input * @param Output $output * @return int */ public function doRun(Inp ...

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

    /*** 删除记录* @access public* @param mixed $data 主键列表 支持闭包查询条件* @return integer 成功删除的记录数*/ public stati ...

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

    /*** 自动写入时间戳* @access public* @param string $name 时间戳字段* @return mixed*/ protected function autoWrit ...

  5. [李景山php]每天TP5-20170131|thinkphp5-Request.php-3

    /*** 获取当前URL 不含QUERY_STRING* @access public* @param string $url URL地址* @return string*/ public funct ...

  6. [李景山php]每天TP5-20170111|thinkphp5-Model.php-4

    /*** 设置需要追加的输出属性* @access public* @param array $append 属性列表* @return $this*/ public function append( ...

  7. [李景山php]每天TP5-20161225|thinkphp5-Console.php-2

    /*** 执行指令* @param Input $input* @param Output $output* @return int*/ public function doRun(Input $in ...

  8. [李景山php]每天TP5-20170125|thinkphp5-Process.php-7

    /*** 获取输入* @return null|string*/public function getInput(){return $this->input;}// 获取输入信息/*** 设置输 ...

  9. [李景山php] ddos 防御基础

    攻击流量到底多大,这是一个关键问题.攻击量的大小.用的防护方法不一样.下面给你讲一讲,1G之内的防护方式.费用在,<1万,每月 谈到DDoS防御,首先就是要知道到底遭受了多大的攻击.这个问题看似 ...

最新文章

  1. 设置php-fpm使用socket文件
  2. pip如何安装whl
  3. 简述使用混合传递参数时的基本原则_JUnit 5参数化方法测试(一)
  4. jpa 删除是否成功_JPA / Hibernate删除实体有时不起作用
  5. 【Python】特征工程:数值特征的缩放与编码
  6. centos8部署Django项目---后台运行
  7. java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践
  8. mac os touch命令_Mac系统忘记开机密码怎么办?
  9. javascript嵌套函数和在函数内调用外部函数的区别
  10. 4G无线预付费电表系统设计及其应用
  11. Linux磁盘ext3变成ext4,从Ext3迁移到Ext4
  12. 我的世界服务器物品栏快捷菜单,我的世界:教你几个实用的快捷键小技巧,萌新可能对此一无所知!...
  13. shell实现加密压缩文件自动解压
  14. 产品和运营区别是什么,别迷惑了。
  15. xbox360 corona hacked, RGH3成功破解corona
  16. 笔记--javascript对象及简单,复杂数据类型
  17. 【Designing ML Systems】第 11 章 :机器学习的人性方面
  18. c++ 用 eigen与opencv计算两个向量的夹角,两个向量之间的夹角,向量的朝向
  19. Allegro专题【1】——orcad创建元器件方法
  20. 不舍红尘,只因恋上你

热门文章

  1. 剑指offer面试题[16]-反转链表
  2. C++栈与队列基本操作
  3. java this 方法,使用“this”用方法(用Java)
  4. 压力测试实践一:JMeter + JProfiler 入门
  5. java socket 浏览器_java实现websocket(图文)
  6. linux 备份路由配置文件,RouterOS的备份和恢复
  7. 输入n个字符串字典序排序_30个Python奇淫技巧集
  8. php fpm 平滑重启,nginx、php-fpm平滑重启和重载配置
  9. mysql特有语法_MySQL 独有SQL语法汇总(一)
  10. linux防火墙桌面关闭端口,Linux关闭防火墙,开放端口