警告:只会将第一个字节分配给字符串偏移量
Warning: Only the first byte will be assigned to the string offset
以下代码在 PHP 7 中运行良好,为什么我在 PHP 8 中看到此警告?
$str = 'xy';
$str[0] = 'bc';
从 PHP 8 开始,尝试使用方括号样式将字符串偏移量替换为一个以上的字节将发出 warning
.
所以你只需要删除多余的字节(c
在这种情况下)
$str = 'xy';
$str[0] = 'b';
或者如果你真的想用 bc
替换 x
你可以使用 substr_replace
$str = 'xy';
var_dump(substr_replace($str, 'bc', 0, 1)); // output: string(2) "bcy"
注意:此函数接受字节偏移量,而不是代码点偏移量。
实际上代码与 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 documentation所说:
Internally, PHP strings are byte arrays. As a result, accessing or
modifying a string using array brackets is not multi-byte safe, and
should only be done with strings that are in a single-byte encoding
such as 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"
以下代码在 PHP 7 中运行良好,为什么我在 PHP 8 中看到此警告?
$str = 'xy';
$str[0] = 'bc';
从 PHP 8 开始,尝试使用方括号样式将字符串偏移量替换为一个以上的字节将发出 warning
.
所以你只需要删除多余的字节(c
在这种情况下)
$str = 'xy';
$str[0] = 'b';
或者如果你真的想用 bc
替换 x
你可以使用 substr_replace
$str = 'xy';
var_dump(substr_replace($str, 'bc', 0, 1)); // output: string(2) "bcy"
注意:此函数接受字节偏移量,而不是代码点偏移量。
实际上代码与 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 documentation所说:
Internally, PHP strings are byte arrays. As a result, accessing or modifying a string using array brackets is not multi-byte safe, and should only be done with strings that are in a single-byte encoding such as 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"