You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何简单的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规范:

  1. 修正目录结构
    PSR-4的规则是:命名空间前缀对应项目根目录下的指定文件夹,前缀后的命名空间部分与文件夹结构一一对应。你当前把自己的代码放在了vendor/目录下——这是Composer专门存放第三方依赖的目录,自己的业务代码不能放在这里。

    正确的目录结构应该是将代码放在项目根目录的src/下:

    D:\
      temp\
        composer_test\
          test.php
          composer.json
          composer.lock
          vendor\
          src\
            Tire.php  # 对应命名空间 Vehicle\Car\Tire
    
  2. 重新生成自动加载映射
    修改目录结构后,必须执行以下命令让Composer重新生成自动加载文件:

    composer dump-autoload
    
  3. 扩展验证(可选)
    如果需要拆分更深的命名空间,比如把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:45:28