这是由于处理间接变量和方法的评估顺序为
incompatible changes:
Changes to the handling of indirect variables, properties, and methods
Indirect access to variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the previous mix of special cases. The table below shows how the order of evaluaiton has changed.
不,你不必改变这一行:
$item['function']($item, $default);
因为在这里没有特别的评估,它只会使用数组元素作为函数名称并调用该函数.您可以更改它,并且代码仍然可以正常工作,但没有必要.
但正如你已经做的正确,你必须改变:
$this->$item['function']($item, $default);
至:
$this->{$item['function']}($item, $default);
↑ ↑
因为你可以看到这个table:
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']()
PHP 7将假设您首先要访问对象属性,然后要访问该属性的索引,并使用其值作为方法名来调用方法(从左到右的顺序).
要使用变量和索引作为属性名称,您必须使用花括号表示.