<p>composer show 是查看已安装包确切版本的首选方法,直接读取 composer.lock 文件,可显示如 6.1.0 或 dev-develop#abc1234;若提示命令未定义,说明 Composer 版本过低。</p>

用 composer show 查已安装的确切版本(推荐首选)
这是最可靠、不依赖运行环境的方式,直接读取 Composer 锁定的包信息,连 dev 分支或 commit-hash 都能看见。
- 进入项目根目录后执行:
composer show topthink/framework - 输出中
versions行带*的就是当前实际安装版本,例如:* 6.1.0或* dev-develop#abc1234 - 如果提示
Command "show" is not defined,说明 Composer 版本太老(composer self-update - 注意:不要用
composer info—— 它是旧命令,部分新版 Composer 已弃用,行为不稳定
在代码里调用 \think\facade\App::version()(适合调试时快速验证)
这个方法返回的是运行时加载的框架版本,能反映 autoloader 实际加载的是哪个副本,比看 composer.json 更真实。
- 在任意控制器/中间件里加一行:
echo \think\facade\App::version(); - 5.x 中曾支持
THINK_VERSION常量,但 6.x 起该常量不再定义,硬引用会报Notice: Use of undefined constant THINK_VERSION - 如果项目混用了多个 ThinkPHP 副本(比如 vendor 下有 symlink 或手动复制过 framework),这里返回的才是“真正起作用”的那个版本
- 别在 CLI 环境外直接 echo —— 某些响应头未设置时可能触发
headers already sent,建议搭配var_dump()或写入日志
检查 vendor/topthink/framework/src/thinkphp/App.php 文件头注释(离线/无执行权限时兜底)
当服务器禁用 PHP 执行、Composer 不可用、或你只有 FTP 权限时,直接翻源码是最原始也最确定的办法。
- 打开文件,搜索
const VERSION或顶部注释块里的@version标签 - 6.x 路径固定为:
vendor/topthink/framework/src/thinkphp/App.php;5.x 则在thinkphp/base.php里找THINK_VERSION - 常见陷阱:有人误看
thinkphp/library/think/App.php(这是门面类,没版本定义),实际版本号只在核心App.php(框架启动器)里 - 如果看到
const VERSION = '6.0.0-beta'这类带后缀的,说明不是稳定版,生产环境应避免使用
别信 composer.json 里的 "^6.0"(它只表示范围,不是实际版本)
composer.json 写的是“期望版本”,不是“已装版本”——就像购物车写了“买苹果”,不代表冰箱里真有苹果。
立即学习“PHP免费学习笔记(深入)”;
- 例如:
"topthink/framework": "^6.0"可能对应已安装的6.0.2、6.1.0,甚至6.3.5(取决于composer.lock和 install 时的网络状态) - 真正可信的是
composer.lock里的version字段,但它不如composer show直观 - 如果你刚
composer update过但没提交lock文件,团队其他人composer install就可能装出不同小版本,导致环境不一致
实际排查时,先跑 composer show topthink/framework;如果失败,再进 vendor 翻源码;最后才看 composer.json——顺序错了,就容易把“想用的版本”当成“正在用的版本”。



















