Проблема перехода на последние версии PHP в том, что они решили упразднить большую кучу старого кода, который ради совместимости тянули много лет. Но, не смотря на потерю совместимости с большим количеством старых движком, PHP стал работать в разы быстрее и это очень большой плюс для многих. Я же попробую описать основные проблемы, с которыми столкнётся большинство при переносе своего сайта на новые версии PHP.
Для начала, нам надо включить отображение ошибок, чтобы мы знали что вообще надо исправлять, тем более, что довольно часто, мы вместо картинки будем видеть белый экран. Для этого находим в корне нашего сайта файл .htaccess добавим следующую строку
php_value display_errors 1
А если и после этого будете видеть белий лист без ошибок, то добавьте в ваш стартовый файл следующий PHP код:
error_reporting (E_ALL);
Теперь посмотрим на типовые ошибки, которые мы можем получить и как их исправлять:
Strict Standards: Non-static method CModule::_GetCache()
для решения этой проблемы нам надо объявить функцию _GetCache() статичной. Для этого лучше всего воспользоваться поиском файлов по содержимому и искать нам придется, в данном случае, следующее:
function _GetCache
когда найдём данную функцию, надо её заменить на
static function _GetCache
Function ereg_replace() is deprecated
меняем подобные функции
ereg_replace("lang=[^&]*&*", "", $QUERY_STRING);
на
preg_replace("/lang=[^&]*&*/", "", $QUERY_STRING);
Function eregi_replace() is deprecated
аналогично предыдущему, но с модификатором "i"
preg_replace("/lang=[^&]*&*/i", "", $QUERY_STRING);
Function ereg() is deprecated
меняем подобные функции
ereg("<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>", $src);
на
preg_match("/<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>/", $src);
Function eregi() is deprecated
меняем
eregi('<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>', $src)
на preg_match с модификатором "i"
preg_match('/<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>/i', $src)
Strict Standards: Only variables should be passed by reference
Ищем в указаном файле нужную строчку
CCurrency::GetList(($by="SORT"), ($order="ASC"));
и оставляем только сами переменные, а значение выносим выше
$by="SORT"; $order="ASC";
CCurrency::GetList($by, $order);
Strict Standards: mktime()
ну тут всё просто, меняем везде функцию
mktime()
на
time()
Fatal error: Call-time pass-by-reference has been removed
здесь всё дело комбинации"&$". Суть в том, что использовать такую функцию при создании функции можно, а вот при обращении к функции нельзя.
То бишь амперсанды тут
function GetFilterTypeList(&$arrUSER)
мы оставляем, а вот тут
return CFormField::GetFilterTypeList(&$arrUSER);
надо убрать
preg_replace(): The /e modifier is deprecated
это, наверное, самая противная проблема, поскольку придется вместо прямой передачи в функцию, писать ещё одну функцию делающую это... таким образом все функции preg_replace с модификатором "e":
$str = preg_replace("#\x03([^\n\x03]+?)\x03#ies", "convert_to_mailto('\\1', '$link_class')", $str);
надо менять на
$str = preg_replace_callback("#\x03([^\n\x03]+?)\x03#is", function( $t ) use ($link_class) { return convert_to_mailto( $t[1], $link_class ); }, $str);
Отсутствие русского текста
С данной проблемой столкнутся все, у кого сайт работает в кодировке cp1251. Проблема тут в том, что начиная с PHP 5.4 функция htmlspecialchars() по умолчанию стала работать в кодировке UTF-8. Выходов в данной ситуации два:
1 - если почти все тексты сайта находятся в БД, а интерфейс сайта использует языковые файлы, то лучше всего перевести БД и языковые файлы интерфейса в utf8.
2 - заменить в коде сайта все функции htmlspecialchars(), на свою собственную htmlspecialchars1251()
function htmlspecialchars1251($string, $flags=ENT_COMPAT)
{
return htmlspecialchars($string, $flags, "cp1251");
}
Статья обновляемая...