编程

PHP 8.2: str_split 对空字符串返回空数组

911 2022-12-10 08:45:12

str_split 函数将一个指定的字符串拆分成数组,使每个值都包含给定数量的字节。Mbstring 扩展提供了对应的 mb_str_split 函数,使多字节字符的字符串可以分解成数组。

在 PHP 8.2 之前,str_split 函数在碰到空字符串时会错误地返回包含空字符串("")的数组。

str_split('') === [""];

这一行为没有记入文档,且是非预期的,因为空字符串不包含字节。

这一问题在 PHP 8.2 中得到了修复,正确地返回了空数组([])。对于旧版 PHP 中对该错误行为有依赖的应用,这一更新可能会是破坏性更新。

从 PHP 8.2 起,对空字符串调用 str_split 会返回空数组: 

str_split('') === [];

$length,str_split 函数的第二个参数,不影响空数组的返回值。 

Mbstring 扩展的 mb_str_split 函数,在 PHP 8.2 中也和 str_split 行为相同,对空字符串返回空数组。

向后兼容性影响

这是破坏性变更,因为 PHP 8.2 起,str_split 函数输出的返回值不同了。

请注意,使用 str_split 函数将需要拆分为字符(而不是字节)的字符串拆分是不正确的,因为 str_split 函数只拆分给定字节数的字符串,即使一个字符需要多个字节来表示。建议使用 mb_str_split 函数,因为 mb_str_split 也可以正确地分割多字节字符的字符串。

str_split 调用替换为 mb_str_split 通常是最好的方法,因为它可以处理多字节字符,并且在 PHP 版本之间保持一致:

- str_split($value);
+ mb_str_split($value);

在应用必须为空字符串使用包含空字符串的数组的情况下(尽管在语义上不正确),显式这样做会在 PHP 版本中产生一致的结果:

- $bytes = str_split($value);
+ $bytes = $value === '' ? [''] : str_split($value);