关于数组值的PHP全局关键字

tre*_*dev 4 php wordpress

Heyo

我目前正在处理其他人为WordPress撰写的破碎主题.全新安装后会抛出500错误.检查我的本地机器上的代码后,我能够提示以下内容:

    public static function skip_script($conf) {
    $hook_suffix = isset($GLOBALS['hook_suffix']) ? $GLOBALS['hook_suffix'] : null;

    if (isset($conf['variable'])) {
        global $$conf['variable']; 
    }

    $conditions = array(
        'variable' => isset($conf['variable']) && (!isset($$conf['variable']) || !$$conf['variable']),
        'hook_suffix' => isset($conf['hook_suffix']) && (is_null($hook_suffix) || $conf['hook_suffix'] != $hook_suffix)
    );

    return in_array(true, array_values($conditions), true);
}
Run Code Online (Sandbox Code Playgroud)

这对于这个:

if (isset($conf['variable'])) {
    global $$conf['variable']; # What the heck is this?
}
Run Code Online (Sandbox Code Playgroud)

我可以检查PHP错误日志并在服务器上重现相同的错误: PHP Parse error: syntax error, unexpected '[', expecting ',' or ';'

众所周知,这个WordPress主题在过去有效,但在过去的3年中似乎已被抛弃.

让我谈谈问题的核心:global $$conf['variable'];应该做些什么.我假设这是不推荐使用的代码,因为它之前已经有用了.

Dav*_*vіd 5

这看起来像一个动态变量.我认为它正在尝试使用名称全局变量$conf['variable'].

您可以像这样修复错误,只需用花括号括起来:

global ${$conf['variable']};
Run Code Online (Sandbox Code Playgroud)

这确实在PHP 7的新版本中进行了更新/更改,如下所示:

http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect

对间接变量,属性和方法的处理的更改

现在,将严格按照从左到右的顺序对间接访问变量,属性和方法进行评估,而不是之前的特殊情况组合.下表显示了评估顺序的变化情况.

            Old and new evaluation of indirect expressions
| Expression          | PHP 5 interpretation  | PHP 7 interpretation  |
|---------------------|-----------------------|-----------------------|
| $$foo['bar']['baz'] | ${$foo['bar']['baz']} | ($$foo)['bar']['baz'] |
| $foo->$bar['baz']   | $foo->{$bar['baz']}   | ($foo->$bar)['baz']   |
| $foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']() |
| Foo::$bar['baz']()  | Foo::{$bar['baz']}()  | (Foo::$bar)['baz']()  |
Run Code Online (Sandbox Code Playgroud)

必须重写使用旧的从右到左评估顺序的代码,以明确使用带花括号的评估顺序(请参阅上面的中间列).这将使代码向前兼容PHP 7.x并向后兼容PHP 5.x.

  • 转到`global ${$$conf['variable']}` 已经清除了错误。我不确定作者为什么要这样做。我回应了一些东西来标记主题中的这种情况,但无法使这种情况发生。如果是这样,我希望此修复程序符合原作者的意图。 (2认同)
  • 是的,这可能就是他们的意图。PHP 刚刚更新,该代码现已过时。做`global ${$conf['variable']};` 在功能上是等价的,虽然我认为你不需要在`$$conf` 上额外的美元符号,只要一个应该做:) (2认同)
  • 没问题@trevdev,很乐意帮忙:) (2认同)