模型类加载失败的主因是Mac/Linux文件系统严格区分大小写,而Windows不区分;必须确保app/model/User.php文件名与class User定义完全一致,且路径统一用正斜杠。

在Windows开发ThinkPHP项目后部署到Mac或Linux服务器时,模型类加载失败、User::select()返回空数组、new User()报Class not found,90%是因为模型文件命名与系统文件系统特性冲突——Windows不区分大小写能蒙混过关,Mac(APFS/HFS+)和Linux(ext4/xfs)严格区分大小写,一个字母错位就彻底中断自动加载链。
模型文件名与类名必须完全一致
在app/model/目录下创建User.php文件,文件内必须定义class User,不能是user、UserModel或USER。ThinkPHP 6+使用PSR-4自动加载,它把命名空间appmodel和路径app/model/拼接后,再按类名User查找app/model/User.php——如果实际文件叫user.php或UserModel.php,Mac上realpath()返回的路径与预期不匹配,spl_autoload_register直接放弃加载。
这一步操作起来很简单,直接把文件拖进去就行,但务必用代码编辑器确认文件名真实字符:右键→属性→查看“名称”字段是否为User.php,而非显示正常但实际含不可见空格或全角字符。
Windows用户常误以为“文件资源管理器里看着一样就没事”,Mac上Finder默认隐藏扩展名,双击重命名时容易多输一个空格或误删.php,导致物理文件变成User(无后缀),而类加载器仍在找User.php → 【文件名少一个字符或多个空格,Mac上必然Class not found】。
立即学习“PHP免费学习笔记(深入)”;
路径分隔符必须统一用正斜杠
ThinkPHP框架内部已强制使用/作为路径分隔符,但开发者手写的require、file_get_contents或自定义Loader仍可能硬编码反斜杠。Mac系统不识别,遇到C:ppmodelUser.php这类字符串会截断为C:,后续路径全部失效。
检查所有手动路径拼接处,把替换成DIRECTORY_SEPARATOR,或者更稳妥地——全部改用str_replace('\', '/', $path)预处理。
尤其注意config/database.php等配置文件中若写了'prefix' => 'think_',而模型里又显式设了$table = 'think_user',此时路径无关,但若在模型构造函数里调用了file_get_contents('./schema/user.json'),这个./就会因平台差异解析出错。
大小写敏感性验证三步法
第一步:打开终端,cd进入项目根目录,执行ls -l app/model/,确认User.php显示为User.php而非user.php或USER.PHP;
第二步:运行php -r "var_dump(class_exists('appmodelUser'));",返回bool(true)才表示加载成功;
第三步:在控制器中use appmodelUser;后调用User::find(1),不报错且返回数据即通过验证。
Mac系统对大小写极其敏感,哪怕文件名是User.php但类定义写成class user,也会在第二步就返回false——因为PHP解析时类名和文件名双重校验,缺一不可。



















