PHP不正确的变量声明

时间:2018-11-16 16:02:48

标签: php php-5.6 legacy-code php-7.2

调试旧代码,我遇到一个奇怪的问题。旧代码已移至PHP 7.2。我不知道它最初是为哪个版本的PHP编写的,但是它确实可以在PHP 5.6中工作。

下面是我的问题示例...

$variable = '';
$variable['key'] = 'Hello World!';

echo $variable['key'] // H

当我回显$variable['key']时,它仅从值中获得第一个字符。我现在知道这是因为$variable最初是声明为字符串。

但是为什么这在PHP 5.6中有效呢?我该怎么做才能在7.2中完成这项工作,而又无需遍历数千行代码?

我可以使用像strict_types这样的指令吗?

1 个答案:

答案 0 :(得分:6)

来自php.net

  

警告   写入超出范围的偏移量会用空格填充字符串。非整数类型将转换为整数。偏移量类型非法会发出E_NOTICE。仅使用分配的字符串的第一个字符。从PHP 7.1.0开始,分配空字符串将引发致命错误。以前,它分配了一个NULL字节。

http://php.net/manual/en/language.types.string.php#language.types.string.substr

因此,“键”将转换为0,并设置第一个字符。 因为这是字符类型,所以从给定的字符串中仅设置了“ H”。

$variable = '';
$variable['key'] = 'Hello World!';

echo $variable;       
echo $variable['key'];

如果将代码更改为上述代码,则可以更好地了解发生的情况。

因此,文字“你好,世界!”在PHP> = 7.1中丢失并消失了,因为您设置了第一个字符,类型保持为string

在php 5.6中,您将获得 Notice: Array to string conversion in /in/N2poP on line 6

因此,在以前的版本中,您将覆盖complete变量,并且最初的空字符串将消失,PHP仅创建一个新数组。此行为仅在使用空字符串时发生!

文档中也对此进行了说明: http://php.net/manual/en/language.types.string.php#language.types.string.substr

  

注意:从PHP 7.1.0开始,将空索引运算符应用于空   字符串引发致命错误。以前,空字符串是无声的   转换为数组。

最简单的解决方案是删除$variable = '';部分,该部分无论如何都是无效的,并且从未在旧版代码中使用。或将其替换为$variable = [];

因为此行为仅在php <7.1中的空字符串中发生,所以您可以使用正则表达式查找应重构以解决该问题的所有位置。