自动加载
2022年9月29日大约 2 分钟
自动加载
PSR 是什么,PSR-1, 2, 4, 7
PSR-1---基础编码规范
PSR-2---编码风格规范
PSR-4---自动加载规范
PSR-7---HTTP 消息接口规范
psr4规范加载
此处的“类”泛指所有的class类、接口、traits可复用代码块以及其它类似结构。
一个完整的类名需具有以下结构:
\<命名空间>(\<子命名空间>)*\<类名>
完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace";
完整的类名可以有一个或多个子命名空间;
完整的类名必须有一个最终的类名;
完整的类名中任意一部分中的下滑线都是没有特殊含义的;
完整的类名可以由任意大小写字母组成;
所有类名都必须是大小写敏感的。
当根据完整的类名载入相应的文件……
完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应;
// use app\index\controller;
// header("Content-type:text/html;charset=utf-8");
//自动加载的函数
spl_autoload_register(function ($class) {
echo $class; // app\index\controller\Test
//取得当前项目路径
$baseDir = dirname(__FILE__);
//app这个命名空间,指向的就是这个路径
$psr4 = array(
'app\\' => array($baseDir . '/application'),
);
var_dump($psr4);
//array (size=1)
// 'app\' =>
// array (size=1)
// 0 => string 'D:\phpStudy\PHPTutorial\WWW\psr/application' (length=43)
//先要得到顶级命名空间
$arr = explode('\\', $class);
$namespace = $arr[0] . '\\'; //顶级命名空间
//判断当前的命名空间在不在映射数组当中
if (isset($psr4[$namespace])) {
//$class=ucfirst(end($arr));//得到类名,首字母大写
array_shift($arr); //弹出
$path = implode('/', $arr); //用/连接
//大小写问题 Index
$path = $psr4[$namespace][0] . "/{$path}.php";
if (file_exists($path)) {
require $path;
}
}
});
var_dump(new app\index\controller\Test); // object(app\index\controller\Test)[2]