PHP Fatal error: Call-time pass-by-reference has been removed in /var/www/user

При обновлении PHP с 5.3 на 5.4 некоторые клиенты, использующие старые версии популярных CMS столкнулись с подобной ошибкой. Подобный вызов функции с версии PHP 5.3 вызывал предупреждение на странице, а в версии 5.4 передача переменной по ссылке стала невозможна. Рассмотрим решение данной проблемы на примере одного из сайтов клиента:

Смотрим в журнал ошибок:

[Thu Apr 03 10:48:17 2014] [error] [client XXX.XXX.XXX.XXX] PHP Fatal error:  Call-time pass-by-reference has been removed in /var/www/userXXXXX/data/www/xx-xxx.org/phpshop/class/core.class.php on line 541, referer: http://xx-xxx.org/


Или включаем вывод ошибок php в браузере:


Загружаем файл core.class.php на ПК, открываем текстовым редактором и находим в нем 541 строку:


537       function setHook($class_name, $function_name, $data = false, $rout = false) {
538       if ((phpversion() * 1) >= '5.0')
539       return $this->PHPShopModules->setHookHandler($class_name, $function_name, $this, $data, $rout);
540       else
541       return $this->PHPShopModules->setHookHandler($class_name, $function_name, &$this, $data, $rout);
542       }


Нам нужно убрать & из строки №541. Такой вызов функции более не поддерживается.

В итоге получается так:


537       function setHook($class_name, $function_name, $data = false, $rout = false) {
538       if ((phpversion() * 1) >= '5.0')
539       return $this->PHPShopModules->setHookHandler($class_name, $function_name, $this, $data, $rout);
540       else
541       return $this->PHPShopModules->setHookHandler($class_name, $function_name, $this, $data, $rout);
542       }


Сайт снова работает! :)