1

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

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

它出现在这 2 行中:

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];
    }
}
4

1 回答 1

3

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

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

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

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

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

这段代码的实际行为至少从 PHP 4.3 开始就没有改变,PHP 8 中唯一的新内容是额外的消息,它可能不是你想要做的——'NULL'如果你需要的只是'N'?

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

于 2021-01-25T17:49:43.047 回答