Переход с PHP 5.2 на PHP 5.5

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

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

Вывод сообщений об ошибках PHP

Первым делом необходимо включить отображение ошибок в скриптах, разместив код в начале скритпа:

error_reporting(E_ALL ^ E_NOTICE);
ini_set('display_errors', 1);

И теперь тестируя весь функционал скриптов, нужно обращать внимание на ошибки Deprecated и изменять код, в соответствии с сообщением об ошибке. Например, сообщение: "Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead." само подсказывает решение проблемы - нужно заменить функцию mysql_escape_string() на новую: mysql_real_escape_string().

Следует отметить, что Deprecated означает "устаревшая", и заменять все функции отмеченные как Deprecated не обязательно, если скрипты не планируется использовать в долгосрочной перспективе. Можно просто подавить вывод ошибок раздела Deprecated. Но вот если функция уже не доступна, как например session_register(), исключенная из версии PHP 5.4 и старше, то скрипт с такими функциями будет вызывать Fatal error, что потребует обязательного рефакторинга когда.

В одной CMS использовалась самописная функция hex2bin(). В PHP версии 5.4 появилась штатная функция с идентичным именем, но в корне отличающемся функционалом - пришлось переименовывать самописную функцию и заменять все строки кода, где она использовалась, так как такое совпадение имен вызывало ошибку Fatal error: Cannot redeclare hex2bin().

Если несмотря на вставку кода для отображения всех ошибок, ошибки не отображаются, а страница загружается с кодом ошибки HTTP 500, то нужно для начала отключить файл .htaccess, переименовав его, например, в ".h". Если это помогло - ищите ошибки в .htaccess, если нет, тогда нужно создать новый файл PHP, из которого подгрузить проблемный скрипт:

<?php
error_reporting(E_ALL ^ E_NOTICE);
ini_set('display_errors', 1);
// Подгрузить файл, выдающий 500 ошибку протокола HTTP
include_once 'index.php';
?>

Скрытые ошибки htmlspecialchars, htmlentities

Проверяя работу форм на сайте, написанном и работающем в кодировке Windows-1251, обнаружил странное поведение функции htmlspecialchars - все буквы славянских алфавитов эта функция просто удаляла. Начав разбираться с решением проблемы обнаружил, что разработчики PHP с версии 5.4 изменили поведение этой функции: если не указан третий параметр функции, отвечающий за кодировку, то кодировкой по умолчанию становится UTF8, хотя ранее применялась ISO-8859-1, что и вызывает "удаление" букв славянских алфавитов при работе этой функции. Функция htmlentities вызывает аналогичные проблемы.

Решение проблемы - добавление во всем коде параметров в функции htmlspecialchars(), например заменив: htmlspecialchars($str) на htmlspecialchars($str, ENT_COMPAT, 'cp1251').

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

htmlsch() - замена htmlspecialchars() в PHP 5.4 и старше
function htmlsch($str)
  {
  $str = htmlspecialchars($str, ENT_COMPAT, 'cp1251');
  return $str;
  }

Провести рефакторинг (средство реорганизации кода) стандартных функций в популярных средствах разработки PHP, например таких, как NetBeans, на первый взгляд невозможно - выдается ошибка о недопустимости запрошенного действия. Обойти это недоразумение весьма легко: нужно временно разместить свою функцию htmlspecialchars() в коде, провести уже её рефакторинг, после чего её удалить:

Самописная htmlspecialchars для рефакторинга кода
function htmlspecialchars()
  {
  }

Такой же трюк можно провести и с функцией htmlentities.

Call-time pass-by-reference has been removed

Если в PHP 5.3 при использование атрибутов в функциях как ссылки сообщалось, что это устаревшая возможность, то уже в PHP 5.4 выдается Fatal error: Call-time pass-by-reference has been removed in. Для решения этой проблемы, необходимо везде заменить &$var на $var. Если все же необходимо передавать атрибуты в функциях, как ссылки, то тогда нужно изменить сами функции:

// Правильно
function myFunc(&$arg) { }
myFunc($var);
Rather than:

// Не правильно
function myFunc($arg) { }
myFunc(&$arg);

Рефакторинг кода при возникновении ошибки Call-time pass-by-reference has been removed займет, скорее всего, много времени.

Опубликовано: 2013/08/05
HTML-код ссылки на эту страницу:
<a href="http://petrenco.com/php.php?txt=177" target="_blank">Переход с PHP 5.2 на PHP 5.5</a>
15295
Комментарии
Большое спасибо за разъяснение, касательно htmlspecialchars!
Добавить комментарий
Ваш e-mail: (не виден посетителям сайта)
Ваше имя:
Комментарий:
Символы с картинки:
Только выделенные поля формы добавления комментариев обязательны к заполнению.