今天看了下,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();
}
}
打印效果
完成。。。。。