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

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

我贴出源码,大家看下。

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

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

        // 查找 PSR-4
        $logicalPathPsr4 = strtr($class, '\\', DS) . EXT;
        //echo $logicalPathPsr4.'<br>';
        $first           = $class[0];
        //echo '<pre>';print_r(self::$prefixLengthsPsr4);
        if (isset(self::$prefixLengthsPsr4[$first])) {
            //echo $class.'<br>';
            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;
    }

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

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



Mytool.php

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/4/15
 * Time: 22:35
 */
namespace Mytool;

class Mytool{
    public static function sh(){
        return 1000;
    }
}


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

<?php
namespace app\index\controller;

use Mytool\Mytool;
use think\Loader;

class Index
{
    public function index()
    {
        //测试最高效的自动加载类库的方式(添加类库映射)
        $mapper = array('Mytool\\Mytool'=>APP_PATH.'index/Mytool/Mytool.php');
        Loader::addClassMap($mapper);
        return Mytool::sh();
    }
}

打印效果



完成。。。。。





阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页