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 中以非向后兼容的方式改变了(因为他们现在使用更传统的解析器,因此必须使它们的关联性规则自洽)。

这里有更多详细信息: http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect

长话短说,您需要将其重写为:

global ${$arg_list[$i]};

然后您的代码将在 PHP 7 和 PHP 5 上正常工作。

顺便说一句,该函数只有 出现 可以在没有 global 关键字的情况下运行。事实上,它总是为这些变量获取空值。