PHP7方法_存在未捕获错误:函数名必须是字符串

PHP7方法_存在未捕获错误:函数名必须是字符串,php,operator-precedence,php-7,Php,Operator Precedence,Php 7,我得到这个错误: 致命错误:未捕获错误:函数名必须是中的字符串 对于此代码: if (function_exists($item['function'])) { $item['function']($item, $default); } elseif (method_exists($this, $item['function'])) { $this->$item['function']($item, $default); } 我知道把代码改成 if (function_e

我得到这个错误:

致命错误:未捕获错误:函数名必须是中的字符串

对于此代码:

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);
还是可以保持原样

$funName = $item['function'];
并改用(不使用)数组

@Svetlio,不适用于旧版本,但适用于兼容版本

为什么人们会误解这一点?你们都懒得再写一行作业?

这是因为在处理间接变量和方法的评估顺序中:

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

对变量、属性和方法的间接访问现在将严格按照从左到右的顺序进行评估,而不是以前混合使用的特殊情况。下表显示了评估顺序是如何改变的

不,您不必更改此行:

$item['function']($item, $default);
因为这里没有特殊的求值,所以它只使用数组元素作为函数名并调用函数。您可以更改它,代码仍然可以正常工作,但这不是必需的

但由于您已经正确地进行了更改:

$this->$item['function']($item, $default);
致:

$this->{$item['function']}($item$default); ↑ ↑ 正如你在这本书中看到的:

间接表达的新旧评价 表达式PHP5解释PHP7解释 ------------------------------------------------------------------------------- $$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']() PHP7将假定您首先要访问对象属性,然后要访问该属性的索引,并使用其值作为方法名来调用方法(从左到右的顺序)


要使用变量和索引作为属性名,必须使用大括号来表示。

是否确实设置了此项函数键及其字符串?在使用之前添加检查。在旧的PHP版本中是的,但在7中不一定需要。 $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']()