当前位置:  开发笔记 > 编程语言 > 正文

PHP7 method_exists未捕获错误:函数名必须是字符串

如何解决《PHP7method_exists未捕获错误:函数名必须是字符串》经验,为你挑选了1个好方法。

我收到此错误:

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

对于此代码:

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);

还是可以保留原样?



1> Rizier123..:

这是由于处理间接变量和方法的评估顺序的不兼容变化:

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

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

不,您不必更改此行:

$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将假设您首先要访问对象属性,然后您想要从该属性访问索引,并使用其值作为方法名称来调用方法(从左到右的顺序).

要将变量和索引用作属性名称,必须使用花括号来表示.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有