为何简单的PSR-4案例无法与Composer正常工作?
PSR-4自动加载失败问题排查
问题详情
我正尝试通过Composer理解PSR-4的工作机制,目前遇到类加载失败的问题,相关信息如下:
1. composer.json 配置
{ "autoload": { "psr-4": { "Vehicle\\Car\\":"src/" } } }
2. 目录结构(Windows 10环境,根目录为D:\temp\composer_test)
D:\ temp\ composer_test\ test.php composer.json composer.lock vendor\ vehicle\ car\ src\ Tire.php
3. 代码内容
test.php
require __DIR__ . '/vendor/autoload.php'; $tire = new Vehicle\Car\Tire();
Tire.php
<?php namespace Vehicle\Car; class Tire { public function __construct() { echo "initialize Tire\n"; } }
4. 运行错误
D:\temp\composer_test>php test.php PHP Fatal error: Uncaught Error: Class 'Vehicle\Car\Tire' not found in D:\temp\composer_test\test.php:3 Stack trace: #0 {main} thrown in D:\temp\composer_test\test.php on line 3
我安装其他标准包时能正常使用相同格式,不清楚哪里操作有误。
问题原因与解决步骤
核心问题是PSR-4命名空间与目录结构的映射逻辑错误,同时代码存放位置不符合Composer规范:
修正目录结构
PSR-4的规则是:命名空间前缀对应项目根目录下的指定文件夹,前缀后的命名空间部分与文件夹结构一一对应。你当前把自己的代码放在了vendor/目录下——这是Composer专门存放第三方依赖的目录,自己的业务代码不能放在这里。正确的目录结构应该是将代码放在项目根目录的
src/下:D:\ temp\ composer_test\ test.php composer.json composer.lock vendor\ src\ Tire.php # 对应命名空间 Vehicle\Car\Tire重新生成自动加载映射
修改目录结构后,必须执行以下命令让Composer重新生成自动加载文件:composer dump-autoload扩展验证(可选)
如果需要拆分更深的命名空间,比如把Vehicle\Car\的子类放在src/Car/下,可以修改composer.json为:{ "autoload": { "psr-4": { "Vehicle\\": "src/" } } }对应目录结构为
src/Car/Tire.php,命名空间保持Vehicle\Car\Tire即可,修改后同样需要执行composer dump-autoload生效。
内容的提问来源于stack exchange,提问作者Node Programmer
相关产品推荐
相关产品推荐

