PHP spl_autoload_register自动加载找不到指定类问题排查
故障原因
问题出在自动加载器的路径解析逻辑:你写的自动加载函数用了相对路径拼接类文件地址,PHP解析相对路径时会以当前运行脚本的工作目录为基准,不是以自动加载文件所在位置为基准:
- 从根目录
index.php启动时,工作目录是项目根文件夹,拼接出来的classes/controller/ProductCtrl.php路径正确,能找到对应文件,所以类加载正常。 - 直接访问
pages/add-product.php时,工作目录变成了项目下的pages文件夹,自动加载器会尝试找pages/classes/controller/ProductCtrl.php,这个路径根本不存在,自然报类找不到的错误。
修复方案
1. 修改自动加载器代码,固定根目录路径
把类文件查找的基准路径固定为项目根目录,不随运行脚本的位置变化,修改includes/autoload.inc.php的代码如下:
spl_autoload_register(function ($class) { // __DIR__ 指向当前autoload.inc.php所在的includes目录,取上级就是项目根目录 $root = dirname(__DIR__); $classPath = str_replace("\\", DIRECTORY_SEPARATOR, $class); $targetFile = $root . DIRECTORY_SEPARATOR . $classPath . ".php"; if (file_exists($targetFile)) { require $targetFile; } });
2. 统一访问入口(推荐做法)
不要直接打开pages目录下的php文件,所有请求都走根目录的index.php,由index.php加载完自动加载器之后,再根据逻辑引入pages下的对应文件,从根源上避免不同层级脚本的路径错乱问题。
如果确实需要直接访问pages下的文件,那得在每个pages文件开头手动写对自动加载文件的引入路径,比如add-product.php顶部要加:
<?php require "../includes/autoload.inc.php";
这种方式每个文件都要单独写引入路径,后续调整目录结构的时候要改一堆地方,维护成本很高,不建议使用。
内容的提问来源于stack exchange,提问作者Asifur Rahman
相关产品推荐
相关产品推荐

