php内置server不加载vendor/autoload.php是默认行为,需在路由器脚本中显式require dirname(__dir__) . '/vendor/autoload.php',否则类无法自动加载导致class not found错误。

PHP内置Server不加载vendor/autoload.php是默认行为,不是bug
PHP内置Web Server(php -S)本身不执行composer autoload逻辑,它只负责把请求转发给指定的路由器脚本,所有自动加载必须手动触发。你看到的Class not found错误,99%是因为没在路由器文件里require自动加载器。
路由脚本里必须显式require自动加载器
这是最常漏掉的一环。哪怕项目结构标准、composer install成功,只要路由器脚本(比如router.php)开头没写这行,类就找不到:
require __DIR__ . '/vendor/autoload.php';
常见错误现象:
- 访问
/index.php报Class 'App\Controller\Home' not found - 路由能响应,但一用
new SomeClass()就崩 -
composer dump-autoload -o后仍无效——优化 autoload 不解决入口缺失问题
使用场景:任何基于php -S localhost:8000 router.php启动的开发环境
立即学习“PHP免费学习笔记(深入)”;
router.php不能只做路由转发,还要接管PSR-4自动加载上下文
Composer生成的autoload.php依赖当前工作目录和__DIR__路径正确。如果路由器文件放在子目录(如public/router.php),而vendor在项目根目录,就得调整require路径:
require dirname(__DIR__) . '/vendor/autoload.php';
参数差异:
-
__DIR__→ 当前文件所在目录(public/) -
dirname(__DIR__)→ 上级目录(项目根,含vendor) - 硬写
../vendor/autoload.php容易因启动位置不同失效,优先用dirname
性能影响:无额外开销,autoload.php本身是静态映射,仅初始化一次
别把index.php当路由器,也别让router.php空转
典型错误配置:
php -S localhost:8000 index.php
这样启动时,PHP Server会把所有请求交给index.php,但它若没require vendor/autoload.php,照样挂。更糟的是,有人写了个空router.php,只返回file_exists判断,却忘了加自动加载。
正确最小闭环示例(public/router.php):
require dirname(__DIR__) . '/vendor/autoload.php';
if (preg_match('/\.(?:png|jpg|jpeg|gif|css|js|ico|xml|svg|woff|woff2|ttf|eot)$/', $_SERVER["REQUEST_URI"])) {
return false; // 静态资源交由PHP Server原生处理
}
// 其他请求走框架或自定义逻辑
echo (new App\Http\Kernel())->handle($_SERVER);
容易踩的坑:
- 在
router.php里用了new某个类,但autoload.php还没require→ 直接Fatal error - 用
php -S跑在public/目录下,却按./vendor/autoload.php去require → 路径错,报No such file - 修改了
composer.json里的autoload配置后没运行composer dump-autoload→ 新增的命名空间不生效
复杂点在于:自动加载是否生效,取决于三件事同时成立——autoload.php被require、路径对、且composer dump-autoload已更新映射。少一个,类就找不见。











