Нам нужно перемещать 50+ приложений (малый / большой) в PHP 5.3 (с PHP 4.1). Есть ли у кого-нибудь опыт в такой задаче?
Имеет ли смысл перенести сначала на PHP 5.2? Есть ли способ автоматического обнаружения приложений с использованием «PHP 4 Особенности», которые не будут работать в PHP 5?
Я не знаю, как справиться с таким проектом. Благодаря!
Некоторые из синтаксиса для классов изменились между PHP4 и PHP5 – например, в PHP4, метод конструктора был назван таким же, как класс, тогда как в PHP5 конструктор называется __construct()
.
PHP5 все еще может справиться с определениями класса в стиле PHP4, поэтому ваш код, скорее всего, по-прежнему будет работать, но вам все же будет рекомендовано изменить их на новый стиль, так как есть много возможностей, которые вы не сможете используйте иначе. Кроме того, конечно, старый синтаксис будет удален в конечном итоге; ваши классы PHP4 будут разбиты в будущем, поэтому лучше изменить их сейчас, а не ждать, пока это будет срочно.
Глобал. Вы уже должны были использовать $_REQUEST
, $_POST
, $_GET
и $_COOKIES
в PHP4, многие старые коды могут по-прежнему использовать старые глобальные алгоритмы стиля, которые были стандартными для PHP3. Это серьезный риск для безопасности, поэтому, если вы все еще используете register_globals
, вы должны начать работать над своим кодом сейчас, чтобы хотя бы использовать $_REQUEST
вместо этого для каждого места, где вы использовали авто-глобальный. Это может быть очень сложной задачей – трудно будет тратить через большое приложение, пытаясь определить, какие переменные предназначены для глобальных целей, а какие нет, когда в коде нет ничего, чтобы указать один или другой , Возьмите его от кого-то, кто должен был это сделать, это может быть настоящий кошмар. Но это не что-то конкретное для перехода на PHP5 – как я уже сказал, даже если вы придерживаетесь PHP4, вам действительно нужно иметь дело с этой проблемой. PHP5 ничего не меняет, за исключением того, что флаг register_globals
теперь по умолчанию отключен, что может дать вам немного больше стимулов для выполнения этой работы.
Если вы используете какие-либо функции ereg_
regex, они устарели. Вы должны заменить их эквивалентными функциями preg_
. Это не большая задача, и на самом деле функции по-прежнему доступны, поэтому они могут ждать, пока вы готовы игнорировать предупреждения о том, что функция устарела. Но опять же, как и в синтаксисе класса, может быть разумно рассмотреть возможность их изменения.
Другая функция, которая изменилась, когда старый синтаксис устарел, является передачей по ссылке. В PHP4 нам было предложено использовать символ &
в вызове функции для передачи переменных по ссылке. В PHP5 правильный способ сделать это – поместить символ &
в объявление функции, а не там, где вы его называете. Опять же, старый синтаксис все еще работает, но только если вы можете мириться с PHP, бросая предупреждения на вас повсюду.
Самое важное, что нужно прочитать, – это раздел php.net по миграции с PHP 4 на PHP 5 . Поскольку PHP 5 впервые появился, они продвигаются к более строгому языку (PHP будет в строгом режиме по умолчанию в версии 6), поэтому вы должны ожидать увидеть много предупреждений, если не ошибок.
С момента выхода PHP 5.0 появилось больше изменений, связанных с обратной совместимостью, для полноты вы также должны прочитать:
Миграция с PHP 5.0.x на PHP 5.1.x
Миграция с PHP 5.1.x на PHP 5.2.x
Перенос с PHP 5.2.x на PHP 5.3.x
Я понимаю, что это много чтения, но это должен быть полный список всего, что может сломаться.
PHP_CompatInfo может помочь с несколькими проверками зависимостей. Возможно, PHP_CodeSniffer может найти устаревшие конструкции.
Тем не менее, различия между версиями PHP часто славятся. Никогда не было проблем с кодом, основанным на случайных случаях. Если, конечно, этот код по-прежнему полагается на длинные суперглобалы $ HTTP_POST_VARS, то ожидаются еще несколько ошибок.
Например, полезной идиомой для замены зависимости magic_quotes является:
$_POST = array_map("mysql_real_escape_string", $_POST);
Поскольку реалистично большинство приложений никогда не переписываются, чтобы использовать более современные API баз данных.
Прежде всего, вы должны проверить настройки php.ini, особенно такие, как register_globals, magic_quotes_gpc – это может нарушить логику ваших приложений.
Если вы включите error_reporting
и установите его на E_ALL
тогда вы сможете увидеть устаревшие ошибки и т. Д. Я бы не стал ориентироваться на PHP5.2, а затем на 5.3.
Зависит, если вы просто хотите, чтобы приложения работали, или если вы хотите использовать новые возможности PHP и улучшения производительности. Если им просто нужно работать, тогда исправить ошибки и игнорировать предупреждения E_DEPRECATED
и E_NOTICE
.
Если проекты были написаны на достойном уровне, то с ними не должно быть слишком сложно их обновить.
Это не значит, что это не будет ужасно скучной и трудной работой. Это также займет гораздо больше времени, чем вы ожидаете; особенно для 50 приложений!
Отключите display_errors
, включите log_errors
, установите error_reporting
на -1
и обратите внимание на предупреждения E_STRICT
и E_DEPRECATED
.
Этот сценарий миграции (бесстыдный плагин) может помочь вам с некоторыми устаревшими вещами. Он говорит от 5,2 до 5,3, но может быть полезен и для перехода с 4. И вы можете расширить его (патчи приветствуются 🙂 для вещей, которые вы обнаруживаете, часто встречаются.
PHPStorm IDE имеет довольно приличный анализатор кода, который может указывать на некоторые из потенциальных проблем вашего кода. Дайте ему пройти через ваше приложение и посмотреть, есть ли у него что-то интересное. Кроме того, это поможет вам быстро найти ошибки, которые могут возникнуть в результате использования новых ключевых слов в качестве имен функций и т. Д.
Для вашего последнего вопроса: ИМХО, вы должны пойти с 5.3, выполнение задания в два раза мало смысла.