如何解决警告:只会将第一个字节分配给字符串偏移量
以下代码在PHP 7中运行正常,为什么在PHP 8中看到此警告?
$str = 'xy';
$str[0] = 'bc';
解决方法
从PHP 8开始,尝试使用方括号将样式的字符串偏移量替换为一个以上字节将发出warning
。
因此,您只需要删除多余的字节(在这种情况下为c
)
$str = 'xy';
$str[0] = 'b';
或者,如果您真的想将x
替换为bc
,则可以使用substr_replace
$str = 'xy';
var_dump(substr_replace($str,'bc',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字符串是字节数组。结果,访问或 使用数组括号修改字符串不是多字节安全的,并且 仅应使用单字节编码的字符串来完成 例如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,0)); // string(2) "bc"
但是,它不适用于多字节编码。
如果您只想替换一个字符,则可以使用:
$str = 'xy';
$str[0] = substr('bc',1);
var_dump($str); // string(2) "by"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。