mb_str_split() 必须显式传入 utf-8 编码参数,否则默认使用可能为 iso-8859-1 的内部编码,导致中文被按字节错误切分;str_ends_with() 在 php 7.4 中不存在,需手动实现并处理空字符串等边界情况。

PHP 7.4 中 mb_str_split()、str_ends_with() 等函数不是“能用就行”,而是必须明确其边界——比如中文乱码、空值处理、版本兼容性,否则上线后立刻出问题。
mb_str_split() 拆中文字符串时为什么还是乱码?
根本原因不是函数失效,而是没传编码参数。PHP 7.4+ 的 mb_str_split() 默认使用 mb_internal_encoding() 返回的编码,而该值常为 ISO-8859-1 或未显式设置,导致 UTF-8 中文被当单字节切分。
- 必须显式传入第三参数:
mb_str_split("你好世界", 1, 'UTF-8') - 若省略第三个参数,即使源字符串是 UTF-8,也可能返回
['ä', '½', '½', ...'] - 不建议依赖
mb_internal_encoding('UTF-8')全局设置——它可能被其他扩展或框架覆盖 - 对 emoji 字符串(如
"??")也需指定'UTF-8',否则会拆成多个零散代理对
str_ends_with() 在 PHP 7.4 能用吗?
不能。该函数是 PHP 8.0 新增的,PHP 7.4 直接调用会报 Fatal error: Uncaught Error: Call to undefined function str_ends_with()。别被“7.4 支持 mb_str_split”误导,新函数按版本严格隔离。
- PHP 7.4 中替代方案只能手写:
substr($s, -strlen($suffix)) === $suffix,但要先判断$suffix长度是否 ≤$s长度,否则substr返回false - 若需支持数组后缀(类似 PHP 8.0 的第二个参数为数组),必须自行循环比对
- 不要用
strpos()+strlen()组合——它无法正确处理空字符串后缀(str_ends_with("abc", "")应返回true) - 线上项目若尚未升级 PHP 8.0,建议封装一个兼容函数并全局注册,避免散落多处
PHP 7.4 的箭头函数和 null 合并赋值怎么配合用才安全?
箭头函数(fn($x) => $x ?? 'default')在 PHP 7.4 引入,但它不自动展开变量作用域,且 ?? 对 0、""、false 均视为“空”,语义易误判。
- 箭头函数内不能直接访问外部变量,除非用
use显式引入:fn($x) => $x ?? $default会报错,必须写成fn($x) => $x ?? $default并加上use ($default) -
$name = $user['name'] ?? '游客'在$user是null时会触发Notice: Trying to access array offset on null—— 因为??不抑制 notice,只处理“不存在键”的情况 - 更安全写法:
$name = $user['name'] ?? ($user->name ?? '游客')(对象/数组混合结构)或统一用isset($user['name']) ? $user['name'] : '游客' - 数据库查询结果为空时,别直接
$row['id'] ?? 0,先确保$row是数组:is_array($row) ? ($row['id'] ?? 0) : 0
array_filter 保留键名但想重索引,为什么 array_values() 之后还报错?
常见于从数据库取数据后过滤再 JSON 输出的场景:json_encode(array_values(array_filter($data, $cb))) 看似合理,但若 $data 是关联数组且含非整型键(如 ['user_id' => 123]),array_filter 后仍保留原键,array_values() 才真正重置为数字索引——但很多人漏掉这一步,直接 json_encode 导致前端收到对象而非数组。
-
array_filter()默认**完全保留原始键名**,哪怕你只留一个元素,它也是[23 => 'ok'],不是[0 => 'ok'] -
array_values()必须显式调用,且它只处理一级索引,不递归;嵌套数组需单独处理 - 若过滤后结果为空数组,
array_values([])返回空数组[],可直接json_encode,不会出错 - 性能敏感场景慎用链式调用:
array_values(array_filter(...))会遍历两次,大数据量时考虑用 foreach + 条件 push 到新数组
PHP 7.4 的函数看似平滑,但每个新增特性都带着隐性契约:编码参数不可省、版本号不能猜、空值判断不能靠直觉。最常翻车的不是语法写错,而是把“文档说支持”等同于“开箱即用”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











