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
我可以使用的指令?
来自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中的空字符串中,所以您可以使用正则表达式查找应该重构的所有地方来解决问题.
归档时间: |
|
查看次数: |
261 次 |
最近记录: |