tp5 Loader.php,[李景山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);// 加载对应的目录

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值