|
|||
|
Переход с 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="https://petrenco.com/php.php?txt=177" target="_blank">Переход с PHP 5.2 на PHP 5.5</a> 20918
Комментарии
Большое спасибо за разъяснение, касательно htmlspecialchars!
Добавить комментарий
|