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

Only the first byte will be assigned to the string offset warning

刚迁移到PHP8,就出现了这个错误;你知道如何解决这个问题吗?

PHP Warning: Only the first byte will be assigned to the string offset

它出现在这两行中:

if( !isset($value[1]) ) $value[1] = 'NULL' ;
if( !isset($value[2]) ) $value[2] = 'NULL' ;

这是围绕它们的代码:

foreach ($chars as $value) {
    if( !isset($value[1]) ) $value[1] = 'NULL' ;
    if( !isset($value[2]) ) $value[2] = 'NULL' ;

    if (!is_null($value[1])) {
      $newstring = "?" . $value[1];
    }

    if ($value[2] !== null) {
      $newstring = $newstring . '&' . $value[2];
    }
}

错误消息的关键部分是短语“字符串偏移量”;它告诉你 $value[1] 不是指数组中的元素,而是字符串中的字符。

让我们构建一个最小的示例:

$value = 'hello world';
$value[1] = 'NULL' ;
var_dump($value);

这里,$value是一个字符串,所以$value[1]指的是“字符串偏移量1”处的字符,即e.

我们可以重写那个字符,但只能使用不同的单个字符。所以 PHP 忽略 ULL,保留 N,结果是 string(11) "hNllo world".

此代码 hasn't changed since at least PHP 4.3 的实际行为,PHP 8 中唯一的新内容是额外的消息,表明它可能不是您想要做的 - 您为什么要写 'NULL' 如果您只需要 'N'?

在这种特殊情况下,原始代码很可能期望 $value 是一个数组,并且以某种方式获取了一个字符串(在显示的循环中,$chars 应该是一个数组数组,而是一个字符串数组)。我们看不到更广泛的上下文,因此无法知道您的修复需要在哪里。