PHP 5.4 Переадресация времени звонка – доступно легкое исправление?

Есть ли способ легко исправить эту проблему или мне действительно нужно переписать весь старый код?

PHP Неустранимая ошибка: переадресация по времени вызова была удалена … в строке 30

Это происходит везде, когда переменные передаются в функции как ссылки во всем коде.

Solutions Collecting From Web of "PHP 5.4 Переадресация времени звонка – доступно легкое исправление?"

Вы должны указывать вызов по ссылке в определении функции, а не на фактический вызов. Поскольку PHP начал показывать ошибки в версии 5.3, я бы сказал, что было бы неплохо переписать код.

Из документации :

В вызове функции нет ссылочного знака – только для определения функций. Определений функций достаточно, чтобы правильно передать аргумент по ссылке. Начиная с PHP 5.3.0 вы получите предупреждение о том, что «call-time-pass-by-reference» устарело, когда вы используете & in foo(&$a); ,

Например, вместо использования:

 // Wrong way! myFunc(&$arg); # Deprecated pass-by-reference argument function myFunc($arg) { } 

Использование:

 // Right way! myFunc($var); # pass-by-value argument function myFunc(&$arg) { } 

PHP и ссылки несколько неточны. Если использовать соответствующие ссылки в правильных местах, это может обеспечить большие улучшения производительности или избежать очень уродливых обходных решений и необычного кода.

Следующее приведет к ошибке:

  function f(&$v){$v = true;} f(&$v); function f($v){$v = true;} f(&$v); 

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

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

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

Это ничего не сделает:

  function f($v){$v = true;} $r = &$v; f($r); 

Более конкретно, он возвращает ссылку обратно в обычную переменную, поскольку вы не запрашивали ссылку.

Это будет работать:

  function f(&$v){$v = true;} f($v); 

Это означает, что вы передаете ссылку без ссылки, но хотите получить ссылку, и превратите ее в ссылку.

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

Если вам нужно более динамичное поведение, это будет работать:

  function f(&$v){$v = true;} $v = array(false,false,false); $r = &$v[1]; f($r); 

Здесь он видит, что вы хотите ссылку и уже имеете ссылку, поэтому оставляете ее в покое. Он может также связывать ссылку, но я в этом сомневаюсь.

Для тех, кто, как и я, читает это, потому что им нужно обновить гигантский проект наследия до 5.6: в качестве ответов здесь указывается, что быстрого решения нет: вам действительно нужно найти каждое возникновение проблемы вручную и исправить ее ,

Самый удобный способ найти все проблемные строки в проекте (не считая использования полномасштабного статического анализатора кода, который очень точен, но я не знаю, что вы сразу же попадаете в правильное положение в редакторе) использовал Visual Studio Code, который имеет хороший встроенный PHP-интерфейс и его функцию поиска, которая позволяет выполнять поиск по Regex. (Конечно, вы можете использовать любой редактор IDE / Code для этого, который выполняет поиск в PHP и Regex).

Используя это регулярное выражение:

 ^(?!.*function).*(\&\$) 

можно искать по всему проекту для появления &$ только в строках, которые не являются определением функции.

Это все еще вызывает много ложных срабатываний, но это облегчает работу.

Браузер результатов поиска VSCode позволяет пройтись и найти оскорбительные строки очень просто: вы просто щелкаете по каждому результату и смотрите на те, которые подчеркивает красный цвет. Те, которые вам нужно исправить.