Я получаю эту ошибку:
Неустранимая ошибка: 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);
или это можно оставить как есть?
Это связано с несовместимые изменения в порядке оценки для обработки косвенных переменных и методов:
Изменения в обработке косвенных переменных, свойств и методов
Косвенный доступ к переменным, свойствам и методам теперь будет оцениваться строго в порядке слева направо, в отличие от предыдущего сочетания особых случаев. В таблице ниже показано, как изменился порядок оценки.
Нет, вам не нужно менять эту строку:
$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 предполагается, что вы сначала хотите получить доступ к свойству объекта, а затем хотите получить доступ к индексу из этого свойства и использовать его значение в качестве имени метода для вызова метода (слева направо).
Чтобы использовать переменную и индекс в качестве имени свойства, вы должны использовать фигурные скобки, чтобы указать это.
$funName = $item['function'];
И использовать вместо (без) массив.
@Svetlio, не для старых версий, а для совместимых!
Почему люди неправильно понимают это? Вам всем лень написать еще одну строку для назначения?