1

以下代码在 PHP 7 中运行良好,为什么我在 PHP 8 中看到此警告?

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

2 回答 2

1

从 PHP 8 开始,尝试使用方数组括号样式替换超过一个字节的字符串偏移量将发出warning.

所以你只需要删除额外的字节(c在这种情况下)

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

或者如果你真的想替换xbc可以使用substr_replace

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

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

于 2020-10-05T10:08:11.030 回答
0

实际上代码的工作方式与 PHP 7.4 中的相同。唯一的区别是现在它会抛出警告。

$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"
于 2020-10-07T11:56:28.193 回答