升级到7.0时,用5.5写的PHP函数抛出错误

时间:2017-04-14 17:55:19

标签: syntax-error global php-7

这是在升级到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”这个词,“应用程序似乎”现在工作正常,所以我现在要问:

有谁知道具体,为什么Global是非兼容性问题?我的解决方法是简单地将其移除,或者是否会有更好的做法,或者这种移除会不会再困扰我了?

2 个答案:

答案 0 :(得分:2)

Backward incompatible changes

  

全局只接受简单变量

     

Variable variables无法再与global关键字一起使用。如果需要,大括号语法可用于模拟先前的行为:

// Valid in PHP 5 only.
global $$foo->bar;

// Valid in PHP 5 and 7.
global ${$foo->bar};

所以在你的情况下它应该成为:

global ${$arg_list[$i]};

答案 1 :(得分:2)

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关键字的情况下工作。事实上,这些变量总是得到空值。