// 注册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]每天TP5-20161205|Loader.php-3
最新推荐文章于 2017-05-04 10:05:01 发布