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