警告:只有第一个字节将被分配给字符串偏移量



下面的代码在PHP 7中运行得很好,为什么我在PHP 8中看到这个警告?

$str = 'xy';
$str[0] = 'bc';

从PHP 8开始,尝试使用方括号样式用一个以上字节替换字符串偏移量将发出warning

因此,您只需要删除额外的字节(在本例中为c(

$str = 'xy';
$str[0] = 'b';

或者,如果你真的想用bc代替x,你可以使用substra_replace

$str = 'xy';
var_dump(substr_replace($str, 'bc', 0, 1)); // output: string(2) "bcy"

注意:此函数接受字节偏移,而不是代码点偏移。

实际上,代码的工作原理与PHP 7.4中的相同。唯一的区别是现在它抛出了Warning。

$str = 'xy';
$str[0] = 'bc';
var_dump($str); // string(2) "by"
var_dump(phpversion()); // string(6) "7.4.10"

PHP 8

var_dump($str); // string(2) "by"
var_dump(phpversion()); // string(10) "8.0.0beta4"

正如PHP文档所说:

在内部,PHP字符串是字节数组。因此,访问或使用数组方括号修改字符串不是多字节安全的,并且应该只使用单字节编码的字符串例如ISO-8859-1。

如果您想在目标字符串中插入替换字符串中的所有字节,您可以使用:

$str = 'xy';
function chars_replace(string $str, string $replacement, int $indexAt)
{
return substr_replace($str, $replacement, $indexAt, $indexAt + strlen($replacement));
}
var_dump(chars_replace($str, 'bc', 0)); // string(2) "bc"

但是,它不适用于多字节编码。

如果你只想替换一个字符,那么你可以使用:

$str = 'xy';
$str[0] = substr('bc', 0, 1);
var_dump($str); // string(2) "by"

相关内容

  • 没有找到相关文章