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

или он может быть оставлен как есть?

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

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

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

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

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

 $item['function']($item, $default); 

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

Но, как вы уже сделали правильно, вам нужно изменить:

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

чтобы:

  $ this-> { $ item ['function'] } ($ item, $ default);
        ↑ ↑

Поскольку вы можете видеть в этой таблице :

  Старая и новая оценка косвенных выражений
       Выражение PHP 5 интерпретация PHP 7
 -------------------------------------------------- -----------------------------
   $$ foo ['bar'] ['baz'] |  $ {$ foo ['bar'] ['baz']} |  ($$ Foo) [ 'бар'] [ 'Базь]
   $ foo -> $ bar ['baz'] |  $ foo -> {$ bar ['baz']} |  ($ Foo -> $ бар) [ 'Базь]
   $ foo -> $ bar ['baz'] () |  $ foo -> {$ bar ['baz'}} () |  ($ Foo -> $ бар) [ 'Базь] ()
   Foo :: $ bar ['baz'] () |  Foo :: {$ bar ['baz']} () |  (Foo :: $ бар) [ 'Базь] ()

В PHP 7 предполагается, что вы сначала хотите получить доступ к свойству объекта, а затем хотите получить доступ к индексу из этого свойства и использовать его значение как имя метода для вызова метода (порядок слева направо).

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

 $funName = $item['function']; 

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

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

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