直接修改 composer.json 中 "autoload" → "psr-4" 的键值对,如 "app\\": "src/",并执行 composer dump-autoload 生效;路径须相对、双反斜杠转义、避免前缀重叠冲突。

composer.json 里怎么改 PSR-4 的命名空间前缀?
直接改 composer.json 中的 "autoload" → "psr-4" 键值对,改完必须运行 composer dump-autoload 才生效。不执行这步,代码里用新前缀会报 Class not found。
常见写法示例:
{
"autoload": {
"psr-4": {
"App\": "src/",
"OldVendor\Package\": "legacy/"
}
}
}
注意点:
-
App\后面的双反斜杠是必需的,PHP 命名空间分隔符必须转义为\,写成App或App/都会解析失败 - 路径值(如
"src/")必须是相对于composer.json所在目录的相对路径,不能以/开头(即不能写绝对路径) - 多个映射可以共存,但如果有重叠(比如
"A\B\" → "src/a/b/"和"A\" → "src/"),Composer 会按顺序匹配,优先用更长的前缀
修改后类文件找不到?检查自动加载缓存和目录结构
改完 composer.json 并执行了 composer dump-autoload,还是报 Class 'Xxx' not found,大概率是以下三个原因:
- 类文件实际路径与 PSR-4 规则不一致:比如声明了
namespace AppHttpControllers;,那文件必须放在src/Http/Controllers/XXX.php,少一层目录或大小写错(Linux 下敏感)都会失败 - 运行了
composer install或composer update但没加--no-autoloader,它们默认会重新生成 autoload,但如果你之前删过vendor/autoload.php或移动过vendor/,可能残留旧映射 - 项目里手动 require 了旧的 autoload 文件,或者用了
require_once 'vendor/autoload.php'但该文件未更新——确认你 include 的是当前项目根目录下的那个vendor/autoload.php
想让旧命名空间继续可用?别删,叠加映射就行
比如原来用 "OldNamespace": "old-src/",现在想迁移到 "App": "src/",但又不能立刻改完所有 use 语句。这时候不用删旧映射,直接加新映射即可:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"psr-4": {
"App\": "src/",
"OldNamespace\": "old-src/"
}
这样两套类都能加载。但要注意:
- 如果两个命名空间下有同名类(如
OldNamespaceFoo和),且代码里没写全限定名,PHP 会按 <code>use语句决定用哪个,和 autoload 无关 - 不要用 PSR-0 或 classmap 混合覆盖同一命名空间,容易引发不可预测的加载顺序问题
- 开发阶段可加
"optimize-autoloader": true到config,生成更紧凑的 classmap,但仅限生产环境启用,调试时关掉更利于排查
vendor 包里的命名空间能改吗?不能,但可以 alias
第三方包(比如 monolog/monolog)的 PSR-4 映射写死在它自己的 composer.json 里,你改自己项目的配置无效。强行改 vendor 里文件属于破坏性操作,下次 composer update 就会被覆盖。
真有重命名需求(例如避免命名冲突),唯一安全方式是用 Composer 的 autoload-dev + files 加载一个桥接文件,或通过 class_alias() 在运行时创建别名:
// 在 src/Compatibility.php 里
class_alias('MonologLogger', 'MyAppLegacyLogger');
然后在 composer.json 中用 "autoload": {"files": ["src/Compatibility.php"]} 加载它。这种方式轻量、可版本控制,也不会干扰 vendor 自动加载逻辑。
最常被忽略的是:PSR-4 映射只影响「自动加载」,不影响命名空间本身的语义。改了前缀不代表类内部 namespace 声明自动变更,所有 namespace 和 use 语句仍需同步调整,否则类型提示、IDE 跳转、静态分析都会出错。










