thinkphp 5.1 在 php 8.0 下需五项修复:1. 替换所有 create_function() 为匿名函数;2. 将 each() 循环改为 foreach;3. 修正 $str{0} 等字符串偏移语法;4. 在 container.php 中判空反射类型;5. 移除 mbstring.func_overload 配置并升级框架至 v5.1.42。

ThinkPHP 5.1 在 PHP 8.0 环境下启动即报错,常见 create_function() 被移除、each() 函数不存在、字符串偏移语法废弃、反射类型判断崩溃等问题,必须逐项修正核心文件才能跑通。
替换所有 create_function() 调用
ThinkPHP 5.1 中 create_function() 多见于 Cache 类的回调封装逻辑,PHP 8.0 已彻底删除该函数,直接 fatal error。
打开 thinkphp/library/think/Cache.php,全局搜索 create_function。
将形如 create_function('', 'return '.$function.';') 的调用,全部替换为匿名函数: function () use ($function) { return $function; }。
【注意:不能只改一处,Cache.php 中至少存在 3 处 create_function 调用,漏改任一都会导致缓存模块失效】
重写 each() 驱动的 while 循环
旧版 Db.php 和 Model.php 中大量使用 while (list($k, $v) = each($arr)) 遍历数组,PHP 8.0 删除 each(),运行时抛出 Fatal error: Uncaught Error: Call to undefined function each()。
方法一:直接定位到 thinkphp/library/think/Db.php 和 thinkphp/library/think/Model.php,搜索 each(。
将所有 while (list($k, $v) = each($data)) { 结构,替换为标准 foreach:foreach ($data as $k => $v) {。
方法二:若项目自定义了继承 Model 的子类,且其中也存在 each() 写法,必须一并替换——这类代码不会报错但会静默跳过循环体,造成数据丢失。
修复字符串偏移访问语法
PHP 8.0 废弃 $str{0} 写法,ThinkPHP 5.1 的 Model.php、Validate.php 等文件中残留大量该语法,触发 Deprecated 报错并可能中断流程。
第一步:在项目根目录执行命令 grep -r "\$\w\+{\d\+}" thinkphp/,定位所有 {} 偏移用法。
第二步:将 $value{0} 替换为 strlen($value) ? $value[0] : '';将 $str{1} 替换为 strlen($str) > 1 ? $str[1] : ''。
第三步:重点检查 thinkphp/library/think/Model.php 中 getAttr() 方法内所有字符串下标访问,此处不修复会导致字段读取返回 null 或空字符串。
修正 Container 反射类型判断逻辑
PHP 8.0 修改 ReflectionParameter::getType() 行为,返回值可能为 null,而 ThinkPHP 5.1 的 Container.php 直接调用 $param->getType()->getName(),未判空即 fatal error。
打开 thinkphp/library/think/Container.php,定位第 466 行附近(具体行号因版本微调略有浮动)。
将原代码:
$class = $param->getType()->getName();
替换为:
$type = $param->getType();<br>$class = $type && !$type->isBuiltin() ? $type->getName() : null;
紧接着检查下方 if ($class) 分支内所有对 $class 的使用,确保其非 null 后再传入 getObjectParam()。
处理 mbstring.func_overload 引发的弃用警告
该问题不阻断运行但刷屏日志,根源是框架依赖组件仍尝试读取已被 PHP 8.0 移除的 ini 设置。
检查服务器 php.ini,确认是否存在 mbstring.func_overload = 0 这一行——若有,直接注释或删除整行。
执行 php -i | grep mbstring.func_overload,输出应为空或显示 mbstring.func_overload => no value。
升级框架依赖至 topthink/framework ≥ v5.1.42,该版本已移除对 func_overload 的全部引用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











