Я получаю эту ошибку:
Неустранимая ошибка: Ошибка при сбое: имя функции должно быть строкой в
- Подключение к 2-му гену Cloud SQL на App Engine гибкий PHP 7.0 - отсутствует сокет
- PHP 7, Symfony 3: Fatal error 1 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать остальные методы
- PHP Замечание: преобразование массива в строку только на PHP 7
- Тип PHP-намека на примитивные значения?
- Попытка понять оптимизацию array_diff_uassoc
Для этого кода:
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 ['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, а не для более старых версий, но для совместимых!
Почему люди недопонимают это? Вы все ленитесь, чтобы написать еще одну строку для задания?