Fatal error: Class 'appstockserviceToshare' not found 是因 Composer PSR-4 自动加载未配置所致;需在 composer.json 的 autoload.psr-4 中添加 "app\stock\": "application/stock/",执行 composer dump-autoload,并确保命名空间、路径、文件名严格一致。

类文件存在、命名空间也对,但 Fatal error: Class 'appstockserviceToshare' not found —— 这不是代码写错了,是自动加载没生效。ThinkPHP 5.1 不再维护 Loader::import,也不靠手动 require,它完全依赖 Composer 的 PSR-4 自动加载机制。
确认 application 下新模块是否被 Composer 扫描到
ThinkPHP 5.1 的 application/ 目录默认不在 composer.json 的 autoload 配置里。你新增的 stock 模块(路径为 application/stock/)必须显式加入 PSR-4 映射,否则 Composer 根本不会去查这个目录。
- 打开项目根目录下的
composer.json - 找到
"autoload": { "psr-4": { ... } }部分 - 在
psr-4对象中添加一行:"app\stock\": "application/stock/"(注意双反斜杠转义) - 保存后立即执行:
composer dump-autoload
别跳过这一步——光改命名空间或加 use 语句没用,Composer 不知道该去哪找 appstockserviceToshare。
检查命名空间声明与物理路径是否严格一致
ThinkPHP 5.1 对大小写和路径层级极其敏感,尤其在 Linux 生产环境。哪怕一个字母错位,就会 Class not found。
立即学习“PHP免费学习笔记(深入)”;
-
application/stock/service/Toshare.php文件首行必须是:namespace appstockservice; - 类名必须是
class Toshare(不能是toshare或TOShare) - 文件名必须是
Toshare.php(不能是toshare.php或Toshare.PHP) - 如果类里用了
use其他自定义类,那些类也得满足同样规则
Windows 开发时可能“碰巧”不报错,一上服务器立刻失败——这不是 Bug,是 PHP 自动加载机制本身的约束。
避免在命令行脚本中绕过框架自动加载流程
你贴出的脚本直接 require thinkphp/base.php 并手动加载配置,这种写法会跳过 Composer 的自动加载注册时机,导致新模块类不可见。
- 推荐做法:把脚本放到
application/command/下,写成 ThinkPHP 命令类(继承thinkConsoleCommand),然后用php think your:command调用 - 若坚持用独立脚本,必须在
require base.php之前,先触发 Composer 自动加载注册:require __DIR__ . '/vendor/autoload.php'; - 不要在脚本里重复
use appstockserviceToshare后再手动 require 文件——这破坏了 PSR-4 规则,且容易引发类重复定义
框架启动流程(App::run())本身不负责加载业务类,它只管调度;类加载全靠 Composer 在入口前完成初始化。
验证是否真被加载:用 class_exists() 快速定位问题
别只看报错,直接测加载结果更可靠:
var_dump(class_exists('appstockserviceToshare')); // true or false
var_dump(get_declared_classes()); // 滚动查找有没有你的类名
如果返回 false,说明问题一定出在 Composer 配置或路径映射;如果返回 true 却仍报错,大概率是命名空间拼写、文件名大小写、或 PHP opcode 缓存未刷新(opcache_reset() 或重启 Web 服务)。
最常被忽略的是:改完 composer.json 后忘了运行 composer dump-autoload,或者改了文件却没清掉 runtime/cache/ 下的类库缓存(虽然 TP5.1 默认不缓存类映射,但某些部署环境会开启)。



















