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

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

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

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

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

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

14

Решение

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

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

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

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

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

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

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

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

чтобы:

$ This->{$ Пункт [ 'функция']}($ 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 предполагается, что вы сначала хотите получить доступ к свойству объекта, а затем хотите получить доступ к индексу из этого свойства и использовать его значение в качестве имени метода для вызова метода (слева направо).

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

23

Другие решения

$funName = $item['function'];

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

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

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

-1

По вопросам рекламы [email protected]