thinkphp7不支持php7.4的json_throw_on_error行为,需改用json_last_error()检查或手动try/catch jsonexception;db::json()不清洗bom,须前置trim();大整数需显式传json_bigint_as_string避免精度丢失。

ThinkPHP7不支持PHP7.4的JSON_THROW_ON_ERROR行为
ThinkPHP7基于PHP7.0~7.3开发,其底层JSON解析逻辑未适配PHP7.4新增的JSON_THROW_ON_ERROR标志位,直接启用该选项会导致异常未被捕获而中断执行。
第一步:确认当前PHP版本是否为7.4+,运行php -v查看输出;若显示PHP 7.4.x或更高,则不能在ThinkPHP7中直接使用json_decode($str, true, 512, JSON_THROW_ON_ERROR)。
第二步:改用传统错误检查模式——先调用json_decode(),再立即判断json_last_error() === JSON_ERROR_NONE;否则会因异常未声明而触发Fatal error。
第三步:若必须使用JSON_THROW_ON_ERROR,需手动包裹try/catch,且catch类型必须为JsonException而非Exception;【PHP7.4+中JsonException是独立类,继承自Throwable,普通Exception捕获不到】。
ThinkPHP7的Db::json()方法在PHP7.4下无法自动处理BOM头
ThinkPHP7的Db::json()查询封装默认跳过BOM清洗步骤,而PHP7.4对UTF-8 BOM(\xEF\xBB\xBF)更敏感,含BOM的JSON字符串传入后json_decode()直接返回null且不报错。
方法一:读取原始JSON字段前,先用trim($raw, "\x00..\x1F\x7F")剥离不可见控制字符;这一步必须在调用Db::json()之前完成。
方法二:在模型的getAttr访问器中重写解析逻辑,例如:
public function getExtraAttr($value) { $clean = trim($value); return json_decode($clean, true) ?: []; }
注意:不能依赖TP7内置的json类型自动转换,它不触发清洗流程。
PHP7.4强制要求JSON数字精度保留,ThinkPHP7默认截断大整数
PHP7.4默认启用JSON_BIGINT_AS_STRING隐式行为,但ThinkPHP7的toJson()和toArray()方法未传递该选项,导致数据库中存储的19位以上用户ID(如微信OpenID)被转成科学计数法或丢失精度。
在控制器中手动序列化时,必须显式指定选项:
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_BIGINT_AS_STRING)
若使用return json($data),需提前配置全局JSON选项:Config::set('json_options', JSON_UNESCAPED_UNICODE | JSON_BIGINT_AS_STRING);【此配置必须在应用初始化早期写入,路由加载后设置无效】。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











