PHP7 method_exists Неисправность Ошибка: имя функции должно быть строкой

Я получаю эту ошибку:

Неустранимая ошибка: Ошибка при отсутствии: имя функции должно быть строкой в ​​

Для этого кода:

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

Это связано с несовместимыми изменениями в порядке оценки для обработки косвенных переменных и методов:

Изменения в обработке косвенных переменных, свойств и методов

Косвенный доступ к переменным, свойствам и методам теперь будет оцениваться строго в порядке слева направо, в отличие от предыдущего сочетания особых случаев. В приведенной ниже таблице показано, как изменился порядок оценки.

Нет, вам не нужно менять эту строку:

$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 предположит, что вы сначала хотите получить доступ к свойству объекта, а затем хотите получить доступ к индексу из этого свойства и использовать его значение как имя метода для вызова метода (порядок слева направо).

Чтобы использовать имя переменной и индекс как имя свойства, вы должны использовать фигурные скобки, чтобы указать это.

Ответ 2

$funName = $item['function'];

И используйте вместо этого (без) массив.

@Svetlio, а не для более старых версий, но для совместимых!

Почему люди недопонимают это? Вы все слишком ленивы, чтобы написать еще одну строку для задания?