PHP不正确的变量声明

its*_*oco 9 php legacy-code php-5.6 php-7.2

调试遗留代码,我有一个奇怪的问题.遗留代码正在转移到PHP 7.2.我不知道它最初是为哪个版本的PHP编写的,但它确实可以在PHP 5.6中运行.

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

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

echo $variable['key'] // H
Run Code Online (Sandbox Code Playgroud)

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

但为什么这在PHP 5.6中有效?如果不拖曳数千行代码,我该怎么做才能在7.2中完成这项工作?

是否有strict_types我可以使用的指令?

San*_*ser 6

来自php.net

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

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

因此"key"被转换为0,并且第一个字符被设置.因为这是一个char类型,所以只从给定的字符串设置"H".

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

echo $variable;       
echo $variable['key'];
Run Code Online (Sandbox Code Playgroud)

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

所以文字'ello World!' 因为设置了第一个字符,类型保持不变,因此在PHP> = 7.1时丢失并消失string.

在PHP 5.6中你会得到 Notice: Array to string conversion in /in/N2poP on line 6

因此,在以前的版本中,您将覆盖整个变量,并且初始空字符串将消失,PHP只是创建一个新数组.只有空字符串才会出现此问题!

这也在文档中注明:http: //php.net/manual/en/language.types.string.php#language.types.string.substr

注意:从PHP 7.1.0开始,对空字符串应用空索引运算符会引发致命错误.以前,空字符串被静默转换为数组.

最简单的解决方案是删除$variable = '';部件,它无论如何都是无效的,并且从未在您的遗留代码中使用过.或者用它代替$variable = [];

因为这种行为只发生在php <7.1中的空字符串中,所以您可以使用正则表达式查找应该重构的所有地方来解决问题.