这是在升级到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是非兼容性问题?我的解决方法是简单地将其移除,或者是否会有更好的做法,或者这种移除会不会再困扰我了?
答案 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中以非向后兼容的方式发生了变化(因为它们现在使用更传统的解析器,因此必须使它们的关联性规则自洽)。
简而言之,您需要将其重写为:
global ${$arg_list[$i]};
然后您的代码将在PHP 7和PHP 5上正常工作。
顺便提一下,只有的功能才能在没有global
关键字的情况下工作。事实上,这些变量总是得到空值。