我收到此错误:
致命错误:未捕获错误:函数名称必须是字符串
对于此代码:
if (function_exists($item['function'])) { $item['function']($item, $default); } elseif (method_exists($this, $item['function'])) { $this->$item['function']($item, $default); }
我知道将代码更改为
if (function_exists($item['function'])) { $item['function']($item, $default); } elseif (method_exists($this,$item['function'])) { $this->{$item['function']}($item, $default); }
解决了这个错误,但我的问题是,应该这样
$item['function']($item, $default);
也被转换为
{$item['function']}($item, $default);
还是可以保留原样?
这是由于处理间接变量和方法的评估顺序的不兼容变化:
对间接变量,属性和方法的处理的更改
现在,将严格按照从左到右的顺序对间接访问变量,属性和方法进行评估,而不是之前的特殊情况组合.下表显示了评估顺序的变化情况.
不,您不必更改此行:
$item['function']($item, $default);
因为这里没有特殊的评估,所以只使用数组元素作为函数名称并调用函数.你可以改变它,代码仍然可以正常工作,但没有必要.
但正如你已经做的那样,你必须改变:
$this->$item['function']($item, $default);
至:
$this->{$item['function']}($item, $default); ? ?
您可以在此表中看到:
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将假设您首先要访问对象属性,然后您想要从该属性访问索引,并使用其值作为方法名称来调用方法(从左到右的顺序).
要将变量和索引用作属性名称,必须使用花括号来表示.