ThinkPHP命令类需严格遵循PSR-4规范:文件置于app/command/下、命名与类名完全一致(大小写敏感)、命名空间为appcommand、继承thinkConsoleCommand,并在composer.json中配置"appcommand": "app/command/",执行composer dump-autoload -o后方可被php think list识别。

ThinkPHP 命令类(think 命令行工具所用的 Command 类)不会自动加载,除非你按 PSR-4 规范严格对齐命名空间与路径,并执行 composer dump-autoload -o;否则运行 php think list 看不到你的命令,或执行时报 Class "appcommandHello" not found。
命令类文件放哪、怎么命名
命令类必须放在 app/command/ 目录下,文件名需与类名完全一致(大小写敏感),且以 .php 结尾:
- 类名为
Hello→ 文件必须是app/command/Hello.php,不能是hello.php或HelloCommand.php - 类必须声明命名空间
appcommand(不是appcommand少反斜杠,也不是Appcommand首字母大写) - 类必须继承
thinkConsoleCommand
命名空间和 PSR-4 配置必须匹配
ThinkPHP 6+ 不再自己扫描 app/command,而是依赖 Composer 的 PSR-4 自动加载。默认 composer.json 中没有注册 appcommand 前缀,所以必须手动加:
- 编辑项目根目录下的
composer.json,在"autoload": {"psr-4": {...}}里补上:"app\command\": "app/command/"
- 注意:命名空间末尾双反斜杠
\、路径末尾正斜杠/缺一不可 - 改完立刻运行
composer dump-autoload -o(-o不可省,否则开发时可能不生效)
为什么 php think list 仍不显示你的命令
常见卡点不是代码写错,而是环境或缓存问题:
立即学习“PHP免费学习笔记(深入)”;
-
php think list会读取vendor/composer/autoload_psr4.php,如果该文件没更新,说明dump-autoload没真正跑成功——检查终端是否报错、是否在项目根目录执行 - 命令类构造方法里抛了异常(比如连不上数据库),会导致
think初始化失败,直接跳过该命令注册,但错误不明显;建议先清空__construct()再测试 - 用了 IDE 自动生成的命名空间(如 PhpStorm 默认插件生成
AppCommand),实际应为小写appcommand;Linux 服务器上大小写不匹配=类彻底消失 -
app/command/下有非 PHP 文件(如.gitkeep或备份文件Hello.php.bak),Composer 在优化模式(-o)下可能因扫描失败跳过整个目录
最易被忽略的一点:命令类必须定义 configure() 方法并调用 $this->setName('hello'),否则即使加载成功,think list 也不会把它列出来——这不是加载问题,而是命令注册逻辑的硬性要求。



















