PHP error: Call-time pass-by-reference has been removed

Ошибка PHP Call-time pass-by-reference has been removed или ранее Call-time pass-by-reference has been deprecated вызывает большую боль в одном месте у многих пользователей и разработчиков, в том числе это не обошло и в частности меня, поэтому стоит про это написать, что бы более не возвращаться.

В общем всё дело в том, что в некоторых скриптах, внезапно, хотя чаще после смены версии PHP, может возникать ошибка Call-time pass-by-reference и всё бы ничего если бы в одной из версий PHP её из предупреждения не сделали фатальной ошибкой! В чём вообще дело?

Эта ошибка (ранее просто предупреждение) говорит о том, что передача аргументов по ссылке во время вызова функции была объявлена устаревшей а позже и вовсе недопустимой. Т.е. теперь при вызове функции и передаче ей параметра не надо ставить перед параметром знак амперсанд (&), его теперь надо ставить в декларации (объявлении) функции/метода перед этим аргументом. Наличие нужно указывать в определении функции а не в вызове.

Избавиться от этого предупреждения/ошибки можно разными способами. Рассмотрим их по порядку.

В более старых версиях PHP Call-time pass-by-reference было всего лишь предупреждением и избавиться от него можно было лишь просто отключив отображение Warning’ов. Для этого надо в конфигурации PHP (файл php.ini) заменить allow_call_time_pass_reference = off на allow_call_time_pass_reference = on

В новых версиях PHP Call-time pass-by-reference считается фатальной ошибкой, поэтому надо исправлять непосредственно сам скрипт, убрав в указанной строчке символ & (амперсанд) перед именем переменной, передаваемой в какую-либо функцию и добавить его в объявлении функции:

function f($a){...}  //объявление
f(&$a); //вызов

меняем на

function f(&$a){...} //объявление
f($a); //вызов

Собственно после изменения кода ошибка/предупреждение должна исчезнуть.

Поделиться!
Tags: , , ,

49.69MB | MySQL:52 | 0,290sec