Thinkphp5.0.18最高效的实现自定义类的自动加载方式

今天看了下,tp5的源码。发现自定义类库的加载方式 是有顺序的。分别是按映射方式 psr4 psr0,其中最高效的,顺序最前的当然是映射方式。

我贴出源码,大家看下。

private static function findFile($class)
    {
        //echo '
';print_r(self::$map);
        // 类库映射
        if (!empty(self::$map[$class])) {

            return self::$map[$class];
        }

        // 查找 PSR-4
        $logicalPathPsr4 = strtr($class, '\\', DS) . EXT;
        //echo $logicalPathPsr4.'
'; $first = $class[0]; //echo '
';print_r(self::$prefixLengthsPsr4);
        if (isset(self::$prefixLengthsPsr4[$first])) {
            //echo $class.'
'; foreach (self::$prefixLengthsPsr4[$first] as $prefix => $length) { if (0 === strpos($class, $prefix)) { foreach (self::$prefixDirsPsr4[$prefix] as $dir) { if (is_file($file = $dir . DS . substr($logicalPathPsr4, $length))) { return $file; } } } } } // 查找 PSR-4 fallback dirs foreach (self::$fallbackDirsPsr4 as $dir) { if (is_file($file = $dir . DS . $logicalPathPsr4)) { return $file; } } // 查找 PSR-0 if (false !== $pos = strrpos($class, '\\')) { // namespace class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DS); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DS) . EXT; } if (isset(self::$prefixesPsr0[$first])) { foreach (self::$prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (is_file($file = $dir . DS . $logicalPathPsr0)) { return $file; } } } } } // 查找 PSR-0 fallback dirs foreach (self::$fallbackDirsPsr0 as $dir) { if (is_file($file = $dir . DS . $logicalPathPsr0)) { return $file; } } // 找不到则设置映射为 false 并返回 return self::$map[$class] = false; }

所以我们当然就采用映射方式啊。

第一步 在我们的应用模块新建一个用来存第三方类库的目录 如下图

Thinkphp5.0.18最高效的实现自定义类的自动加载方式_第1张图片


Mytool.php


这个是第三方的自己写的类库。。然后控制器调用

APP_PATH.'index/Mytool/Mytool.php');
        Loader::addClassMap($mapper);
        return Mytool::sh();
    }
}

打印效果

Thinkphp5.0.18最高效的实现自定义类的自动加载方式_第2张图片


完成。。。。。





你可能感兴趣的:(thinkphp5)