Статьи

PHP 4.4 Minor Gotcha

Через несколько дней после выпуска 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, и это обновление может ввести новое предупреждение и / или нарушить обратную совместимость.