<p>ThinkPHP 5.1.x小版本升级冲突本质是本地修改了vendor/thinkphp源码,正确做法是git checkout -- vendor/丢弃修改,再composer update topthink/framework:^5.1.41;所有定制必须通过application、extend等合法扩展点实现,严禁直接改vendor。</p>

直接用 composer update 升级 ThinkPHP 5.1.x 小版本(比如从 5.1.37 到 5.1.41)时,出现代码冲突,本质不是 Composer 本身报错,而是你本地修改过框架源码,或项目里混入了被覆盖的 vendor 文件。ThinkPHP 官方明确要求:**不要直接修改 vendor/thinkphp 目录下的任何文件**,否则升级必然出问题。
确认冲突来源:先分清是“改了框架”还是“改了自己”
很多所谓“冲突”,其实是开发者在 vendor/topthink/framework 里手动加过日志、删过验证逻辑、甚至重写了某个核心类——这些改动在 composer update 时会被 Git 拒绝覆盖,表现为“merge conflict”提示。正确做法是:
- 用
git status查看哪些 .php 文件在 vendor 下被标为 modified 或 unmerged - 运行
git checkout -- vendor/丢弃所有对 vendor 的本地修改(这是安全操作,vendor 内容本就不该手动改) - 再执行
composer update topthink/framework:^5.1.41(指定具体包,避免误升其他依赖)
真正要改的地方:只动 application 和 extend,不动 vendor
ThinkPHP 的设计原则是“约定优于配置”,所有定制必须通过合法扩展点完成:
- 需要重写 Request 行为?新建
app/common/behavior/CustomRequest.php,在 behavior.php 中注册 - 要改数据库连接逻辑?在
app/database.php里配置'params'或自定义 PDO 构造参数 - 模板引擎要加标签?写独立标签库类,放进
extend/目录,再在 config/template.php 中声明
升级后必检三件事
哪怕没报错,升级完也得人工核对:
立即学习“PHP免费学习笔记(深入)”;
-
路由兼容性:5.1.39+ 默认关闭
url_route_must,如果旧项目依赖强制路由,需在route.php显式设为 true -
反序列化入口:5.1.41 修复了
unserialize()相关漏洞,若你项目中曾为调试临时加过类似unserialize(base64_decode($_GET['data']))的代码,必须立刻删除 -
模板缓存路径:5.1.40 调整了
Runtime/Cache/下编译模板的命名规则,首次访问页面可能报“模板不存在”,清空runtime/cache/目录即可
框架升级不是覆盖替换,而是按规范迁移。改 vendor 是走捷径,结果只能卡在半路。



















