跨应用调用模型命名冲突源于PSR-4路径与命名空间错位,须确保目录、命名空间、调用方式三者严格对齐:各应用模型应置于对应子目录(如app/admin/model/User.php),声明namespace app\admin\model;复用逻辑抽至app/common/model并继承;调用需use全限定名;大小写必须一致;避免字段名与框架属性同名导致静默覆盖。

跨应用调用模型时出现命名冲突,本质是 PSR-4 自动加载路径与命名空间错位导致类找不到或加载错类——不是代码写错了,而是框架按规则“找偏了”。关键不在改模型名,而在确保目录、命名空间、调用方式三者严格对齐。
模型必须放在对应应用的专属命名空间下
ThinkPHP 不会把 app/model/User.php 当作“全局模型”自动绑定到各应用配置。如果模型放在 app/model/ 下,它属于全局命名空间 app\model,调用时走的是主应用(如 index)的数据库连接和前缀,admin 应用调用它时仍用 index 的配置,容易查错表或连错库。
- 正确做法:每个应用用自己的模型,路径为 app/admin/model/User.php,命名空间声明为 namespace app\admin\model;
- 若需复用逻辑,可将通用模型抽到 app/common/model/,再在各应用模型中继承:class User extends \app\common\model\User
- 切勿把 admin 模型放在 app/model/ 并手动改命名空间为 app\admin\model —— 这违反 PSR-4,composer dump-autoload 后类根本不会被注册
跨应用调用必须显式 use 全限定名
在 app/index/controller/IndexController.php 中想调用 admin 的用户模型,不能直接 new User() 或 new \app\admin\model\User()(后者虽能运行但不推荐),而必须先声明:
- use app\admin\model\User; → 然后 new User()
- 静态调用同理:use app\admin\model\User; → User::find(1)
- 避免在控制器里写 new \app\admin\model\User() 这种硬编码路径——可读性差,且 IDE 无法跳转、类型提示失效
命名空间与目录名大小写必须完全一致
Linux 服务器、Docker 容器对大小写敏感。app/Admin/model/User.php 在 Windows 上可能正常,一上线就 Class not found。
立即学习“PHP免费学习笔记(深入)”;
- 应用目录名必须全小写:app/admin ✅,不是 app/Admin 或 app/ADMIN
- 对应命名空间必须全小写:namespace app\admin\model; ✅,不是 app\Admin\model
- 文件名必须首字母大写(符合类名):User.php ✅,不是 user.php 或 usermodel.php
避免模型字段与框架属性同名引发静默覆盖
如果数据表有 name 字段,而模型继承 think\Model,赋值 $user->name = 'xxx' 实际会修改模型的 $name 属性(即表名),导致 save() 写入错误表。
- 建表时尽量避开 name、table、pk、connection 等 think\Model 类已定义的属性名
- 若已有 name 字段,访问时改用 $user->getAttr('name') 或 $user->getData('name'),避免触发魔术方法 __set
- 也可在模型中重命名字段映射:protected $type = ['name' => 'string']; 并配合 get/set 方法隔离



















