PHP 5.5 中编写的函数在升级到 7.0 时抛出错误
PHP function written in 5.5 throws error when upgraded to 7.0
这是升级到 7.0 之前有效的函数
function set_session_vars() {
$nb_args=func_num_args();
$arg_list=func_get_args();
for($i=0;$i<$nb_args;$i++) {
global $$arg_list[$i];
$_SESSION[$arg_list[$i]] = $$arg_list[$i];
}
}
现在它导致错误说:
Parse error: syntax error, unexpected '[', expecting ',' or ';' in /home/mvyc1956/public_html/members/includes/functions.php on line 322
我认为它与 GLOBAL 的非向后兼容更改以及 $$ 和数组的使用有关,但我的 PHP 还不够好,无法弄清楚。
有没有人知道这行的原因:
global $$arg_list[$i];
第 322 行被报告为错误原因,现在会失败,您建议我将代码更改为什么以使其与 PHP 7 一起使用?
我进行了一些谷歌搜索并找到了 this page,但同样,我不明白需要更改的内容。
谢谢
表示语法错误,因此函数中的某些代码不再有效,但需要 php 7 专家才能看到。
更新
我从上面的代码中删除了 GLOBAL 这个词,应用 "seems" 现在可以正常工作了,所以我现在要问:
有没有人具体知道,为什么全局是不兼容问题?我简单地删除它的解决方法是可靠的还是会有更好的做法,或者这种删除会再次困扰我吗?
Backward incompatible changes:
global only accepts simple variables
Variable variables can no longer be used with the global keyword. The curly brace syntax can be used to emulate the previous behaviour if required:
// Valid in PHP 5 only.
global $$foo->bar;
// Valid in PHP 5 and 7.
global ${$foo->bar};
所以在你的情况下它应该变成:
global ${$arg_list[$i]};
global 关键字告诉 PHP 访问全局变量(每次启动脚本)而不是局部变量(每个函数)。例如,
global $foo;
意味着以后在该函数中使用变量 $foo 是指具有该名称的全局变量,而不是函数本身内的变量。
它试图做的是在全局命名空间中通过任意名称查找变量。那是完全错误的做事方式。相反,您应该有一个全局数组并在数组中使用键。事实上,一般来说,$$ 可以说是一个坏主意。
但这不存在。问题是解析规则在 PHP 7.0 中以非向后兼容的方式改变了(因为他们现在使用更传统的解析器,因此必须使它们的关联性规则自洽)。
长话短说,您需要将其重写为:
global ${$arg_list[$i]};
然后您的代码将在 PHP 7 和 PHP 5 上正常工作。
顺便说一句,该函数只有 出现 可以在没有 global
关键字的情况下运行。事实上,它总是为这些变量获取空值。
这是升级到 7.0 之前有效的函数
function set_session_vars() {
$nb_args=func_num_args();
$arg_list=func_get_args();
for($i=0;$i<$nb_args;$i++) {
global $$arg_list[$i];
$_SESSION[$arg_list[$i]] = $$arg_list[$i];
}
}
现在它导致错误说:
Parse error: syntax error, unexpected '[', expecting ',' or ';' in /home/mvyc1956/public_html/members/includes/functions.php on line 322
我认为它与 GLOBAL 的非向后兼容更改以及 $$ 和数组的使用有关,但我的 PHP 还不够好,无法弄清楚。
有没有人知道这行的原因:
global $$arg_list[$i];
第 322 行被报告为错误原因,现在会失败,您建议我将代码更改为什么以使其与 PHP 7 一起使用?
我进行了一些谷歌搜索并找到了 this page,但同样,我不明白需要更改的内容。
谢谢
表示语法错误,因此函数中的某些代码不再有效,但需要 php 7 专家才能看到。
更新 我从上面的代码中删除了 GLOBAL 这个词,应用 "seems" 现在可以正常工作了,所以我现在要问:
有没有人具体知道,为什么全局是不兼容问题?我简单地删除它的解决方法是可靠的还是会有更好的做法,或者这种删除会再次困扰我吗?
Backward incompatible changes:
global only accepts simple variables
Variable variables can no longer be used with the global keyword. The curly brace syntax can be used to emulate the previous behaviour if required:
// Valid in PHP 5 only.
global $$foo->bar;
// Valid in PHP 5 and 7.
global ${$foo->bar};
所以在你的情况下它应该变成:
global ${$arg_list[$i]};
global 关键字告诉 PHP 访问全局变量(每次启动脚本)而不是局部变量(每个函数)。例如,
global $foo;
意味着以后在该函数中使用变量 $foo 是指具有该名称的全局变量,而不是函数本身内的变量。
它试图做的是在全局命名空间中通过任意名称查找变量。那是完全错误的做事方式。相反,您应该有一个全局数组并在数组中使用键。事实上,一般来说,$$ 可以说是一个坏主意。
但这不存在。问题是解析规则在 PHP 7.0 中以非向后兼容的方式改变了(因为他们现在使用更传统的解析器,因此必须使它们的关联性规则自洽)。
长话短说,您需要将其重写为:
global ${$arg_list[$i]};
然后您的代码将在 PHP 7 和 PHP 5 上正常工作。
顺便说一句,该函数只有 出现 可以在没有 global
关键字的情况下运行。事实上,它总是为这些变量获取空值。