ThinkPHP5.0.24升级到5.1必须重建应用骨架,不支持就地升级;需用composer创建新项目、迁移业务代码、重写命名空间、路由、数据库表达式及模板路径等。

ThinkPHP5.0.24 到 ThinkPHP5.1 不是小版本更新,而是不兼容升级。直接替换核心文件、改个版本号或 Composer update 就跑起来?大概率路由失效、模板找不到、数据库报错、甚至白屏——这不是升级失败,是预期行为。
必须重建应用骨架,不能“就地升级”
TP5.1 强制使用 app/ 目录替代 application/,命名空间、自动加载规则、配置结构全部重定义。官方明确不支持无缝迁移。
- 用
composer create-project topthink/think=5.1.* myapp初始化干净的 TP5.1 项目 - 把原项目的
app/(或application/)下业务代码逐模块迁入新项目的app/目录 - 废弃旧项目的
thinkphp/目录——别复制进去,新版已重构底层 - 检查并重写所有
namespace:比如application\index\controller\Index→app\index\controller\Index - 确认 PHP 版本 ≥ 5.6(TP5.1 最低要求),否则连
composer install都会失败
路由和控制器命名必须严格匹配新规范
TP5.1 路由解析更严格,控制器类名、方法名、模板名三者绑定逻辑变了,错一个就 404。
- 控制器类名必须以
Controller结尾,且继承think\Controller(不是think\controller\Controller) - 操作方法名如
helloWorld,默认匹配模板hello_world.html(不是helloworld.html),若沿用旧模板,需显式写return view('helloworld'); -
route.php中的数组式路由(如['index' => ['index/index']])已废弃,必须改用闭包或链式注册:Route::get('index', 'index/index'); - 如果用了分组路由,注意
prefix和middleware的注册方式变化,老写法会静默失效
数据库查询中所有 exp 必须包裹 Db::raw()
这是最常踩的坑:TP5.0 允许裸字符串,TP5.1 会直接抛异常,且错误提示不明确(常卡在 where 或 update 处)。
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
$where['score'] = ['exp', 'score + 1']; - 正确写法:
$where['score'] = ['exp', Db::raw('score + 1')]; - 更推荐用专用方法:
$model->exp('score', 'score + 1')->update();或$model->whereExp('id', '>100')->select(); -
exists子查询同理:['', 'exists', Db::raw('SELECT * FROM user WHERE status = 0')],否则报错
视图层路径与常量要重置,不能靠“猜”
模板路径没改对,页面就空着;常量还在用 {__ROOT__},页面就原样输出那段文字——这类问题不会报错,但前端完全不可用。
- 模板目录必须从
application/index/view/改为app/index/view/,且控制器中view('index/index')的路径前缀仍有效(前提是文件真在那儿) -
{__ROOT__}和{__STATIC__}已被移除,不能再用。统一改用{:url('')}或{:file_get_contents(Env::get('ROOT_PATH').'public/static/css/app.css')} -
{include file="public/header"}在 TP5.1 中默认只查当前模块目录,应改为{include file="index/public/header"}或启用template.view_path配置后用相对路径 -
{volist}嵌套时key属性作用域变严格,外层key="k"和内层key="k"会冲突,必须显式区分如key="outer_k"/key="inner_k"
真正麻烦的不是某一行代码怎么改,而是框架约定变了——你得按 TP5.1 的“语法”重写整个应用的组织逻辑。哪怕只改一个控制器,也要同步调整路由注册、模板路径、命名空间、数据库表达式写法。漏掉任意一环,都可能让某个页面或接口在上线后突然失效。



















