mb_substr($str, 0, null, 'UTF-8') 在 PHP 8.1 中合法,真正报错主因是 $length 传入字符串(如''或'null')或负数逻辑误判,而非 null 本身;需确保其为 int 或 null 类型并显式指定 UTF-8 编码。

mb_substr($str, 0, null, 'UTF-8') 在 PHP 8.1 中报错,根本原因不是 null 本身不合法,而是你传入了 null,但函数签名在 PHP 8.1 中已明确要求 $length 参数为 ?int(可为空的整型),而实际运行时若启用了严格类型检查(如 declare(strict_types=1)),且你又显式写了 null 字面量,就可能触发类型不匹配警告或错误——但这通常不会直接 fatal error,真正报错更大概率来自以下两种情况:
? 1. 你启用了 strict_types=1,且 $length 实际是字符串 "null" 或未定义变量
常见误写:
declare(strict_types=1); $len = null; // ✅ 正确:$len 是 null mb_substr($str, 0, $len, 'UTF-8'); // ✅ 合法(PHP 8.0+ 支持 ?int) // ❌ 错误示例: $len = "null"; // 字符串,非 null mb_substr($str, 0, $len, 'UTF-8'); // TypeError: int expected, string given // ❌ 更隐蔽的错误: $len = $_GET['len'] ?? null; // 若未设置,$len 是 null ✅ // 但如果 $_GET['len'] 是空字符串 '',那 $len 就是 '' → string → 报错
✅ 建议做法:显式过滤/转换
$length = $_GET['len'] ?? null;
if ($length !== null && !is_numeric($length)) {
$length = null;
}
$length = $length === null ? null : (int)$length;
$result = mb_substr($str, 0, $length, 'UTF-8');
? 2. 你传的是 NULL(全大写),而 PHP 严格模式下常量大小写敏感?
不,NULL 和 null 在 PHP 中完全等价,大小写不影响。这个不是原因。
⚠️ 3. 真正高频报错场景:$length 是负数,且你没意识到它被当作“从末尾截断”处理,但逻辑上你期望它“不限长度”,结果却意外返回空串,你以为是报错
例如:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
mb_substr("abc你好", 0, -100, 'UTF-8'); // 返回 ''(空字符串),不是报错
// 但如果你代码里写了 if (!$result) { throw new Exception(); },就会“感觉像报错”
✅ 提示:
$length为负数是合法行为(从结尾往前切),PHP 文档明确支持,不报错。
✅ 正确用法总结(PHP 8.1 安全写法)
-
mb_substr($str, 0, null, 'UTF-8')→ ✅ 合法,等价于截到末尾 -
mb_substr($str, 0, 5, 'UTF-8')→ ✅ 标准用法 -
mb_substr($str, 0, -2, 'UTF-8')→ ✅ 合法,去掉末尾 2 个字符 -
mb_substr($str, 0, '', 'UTF-8')→ ❌ 报TypeError:stringgiven, expectedint|null -
mb_substr($str, 0, '5', 'UTF-8')→ ❌ 同上,类型不匹配
? 额外提醒:别忽略编码参数
即使 $length 没问题,如果漏掉 'UTF-8' 且内部编码不是 UTF-8(比如是 ISO-8859-1),中文仍会乱码或截断异常——这不是报错,但效果等同于“失效”。
推荐始终显式传编码:
mb_substr($str, 0, $len, 'UTF-8');
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










