Через несколько дней после выпуска PHP 4.4 было интересно наблюдать за обсуждениями, связанными с возможной проблемой обратной совместимости, которая была представлена в релизе. Комментаторы, похоже, разделились по поводу того, действительно ли это является нарушением обратной совместимости.
«Нарушение обратной совместимости» — это фактически новое уведомление, генерируемое кодом обработки ошибок PHP, предупреждающее разработчиков при попытке вернуть временную переменную по ссылке. Похоже, что уведомление было добавлено в ответ на ошибку в PHP 4.3 при обработке ссылок.
Сегодня, когда я обновил свой собственный сервер разработки дома до PHP 4.4, я столкнулся с этой проблемой. Приложение, над которым я работал, работает в своем собственном режиме «отладки», который делает уведомления действительно видимыми, выводя уведомление на вывод.
Виновник:
Примечание в D: htdocsaaaresourcesincludescontrols.inc.php, строка 14: только ссылки на переменные должны возвращаться по ссылке
Рассматриваемая строка относится к следующему методу:
function &getnodecontrol($objecttype)
{
require_once(RESOURCE_DIR . "nodecontrols/$objecttype.inc.php");
return new $objecttype($this->db);
}
Проблема здесь в том, что «новый $ objecttype ($ this-> db)» не является переменной — это результат «нового» оператора — фактически «временной» переменной — на которую PHP не может создать ссылку. Единственное, что может быть возвращено, когда переменная возвращается по ссылке, это переменная, которая была инициирована.
Как говорится в руководстве по PHP, возвращаются ссылки :
Примечание. Если вы попытаетесь вернуть ссылку из функции с синтаксисом: return ($ found_var); это не сработает, так как вы сейчас пытаетесь вернуть результат выражения, а не переменной, по ссылке. Вы можете возвращать переменные только по ссылке из функции — больше ничего.
Проблема решена, и уведомление отклонено с помощью следующего кода:
function &getnodecontrol($objecttype)
{
require_once(RESOURCE_DIR . "nodecontrols/$objecttype.inc.php");
$control = new $objecttype($this->db);
return $control;
}
Здесь результат «new $ objecttype ($ this-> db)» сохраняется в переменной, и возвращается ссылка на эту переменную.
Эта статья от eZ Systems описывает изменения более подробно.
Изменения в поведении подвергались критике со стороны тех, чьи приложения были затронуты этим изменением. Один из примеров — это сообщение о проблеме с Horde , клиентом веб-почты.
В ответ другие отметили, что уведомления не должны быть включены в производственной среде в любом случае, и, следовательно, изменение не должно вызывать каких-либо проблем.
В еженедельном обзоре Zend (№ 245) содержалось забавно сжатое изложение проблемы Орды.
Интересно, что обсуждение связано с более новой ошибкой в PHP 4.4, которая включает передачу по ссылке . Он намекает на то, что для его исправления может потребоваться будущее обновление PHP 4.4, и это обновление может ввести новое предупреждение и / или нарушить обратную совместимость.