Ваш опыт перехода с PHP 4 на PHP 5 [закрыт]


Нам нужно переместить более 50 приложений (малых/больших) на PHP 5.3 (с PHP 4.1). Есть ли у кого-нибудь опыт работы с такой задачей?

  • Необходимое время
  • Инструменты
  • Лучшая настройка для среды (Серверы/Тестирование?)

Имеет ли смысл сначала перейти на PHP 5.2? Есть ли какой-либо способ автоматического обнаружения приложений с использованием "Функций PHP 4", которые не будут работать в PHP 5?

Я понятия не имею, как справиться с таким проектом. Спасибо!

Author: Charles, 2011-02-04

6 answers

  1. Часть синтаксиса классов изменилась между PHP4 и PHP5 - например, в PHP4 метод конструктора был назван так же, как и класс, тогда как в PHP5 конструктор называется __construct().

    PHP5 все еще может справляться с определениями классов в стиле PHP4, поэтому ваш код, скорее всего, все еще будет работать, но вам все же рекомендуется изменить их на новый стиль, так как есть много функций, которые вы не сможете использовать иначе. Кроме того, конечно, старый синтаксис в конце концов будет удален; ваши классы PHP4 в будущем сломаются, поэтому лучше изменить их сейчас, а не ждать, пока это не станет срочным.

  2. Глобалы. Вы уже должны были использовать $_REQUEST, $_POST, $_GET и $_COOKIES в PHP4 многие старые коды все еще могут использовать автоглобалы старого стиля, которые были стандартными в PHP3. Это огромный риск для безопасности, поэтому, если вы все еще используете register_globals, вам следует начать работать над своим кодом сейчас, чтобы, по крайней мере, использовать $_REQUEST вместо в каждом месте, где вы использовали авто-глобализацию. На самом деле это может быть очень сложной задачей - может быть трудно разобраться в большом приложении, пытаясь определить, какие переменные должны быть глобальными, а какие нет, когда в коде нет ничего, что указывало бы так или иначе. Поверьте тому, кому пришлось это сделать, это может быть настоящим кошмаром. Но это не что-то особенное для перехода на PHP5 - как я уже сказал, даже если вы придерживаетесь PHP4, вам действительно нужно решить эту проблему. PHP5 ничего не меняет, за исключением того, что флаг register_globals теперь по умолчанию отключен, что может дать вам немного больше стимулов для выполнения этой работы.

  3. Если вы используете какие-либо функции регулярных выражений ereg_, они устарели. Вы должны заменить их эквивалентными функциями preg_. Это не большая задача, и на самом деле функции все еще доступны, так что это может подождать, пока вы готовы игнорировать предупреждения о том, что функция устарела. Но опять же, как с синтаксисом класса может быть разумно рассмотреть возможность их изменения сейчас.

  4. Еще одна функция, которая изменилась, когда старый синтаксис устарел, - это передача по ссылке. В PHP4 нам было рекомендовано использовать символ & в вызове функции для передачи переменных по ссылке. В PHP5 правильный способ сделать это - поместить символ & в объявление функции, а не там, где вы его вызываете. Опять же, старый синтаксис все еще работает, но только если вы можете смириться с PHP, который повсюду бросает вам предупреждения.

 6
Author: Spudley, 2011-02-10 09:04:09

Самой важной вещью для чтения было бы 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

Я понимаю, что это много чтения, но это должен быть полный список всего, что может сломаться.

 11
Author: ZoFreX, 2011-02-04 09:51:26

Php_compatinfo может помочь с несколькими проверками зависимостей. PHP_CodeSniffer, возможно, с поиском устаревших конструкций.

Однако различия между версиями PHP часто преувеличиваются. Никогда не было особых проблем с кодом, полагающимся на второстепенные случаи. Если, конечно, этот код все еще не опирается на длинные суперглобальные $HTTP_POST_VARS, то следует ожидать нескольких других ошибок.

Полезная идиома для замены зависимости magic_quotes, например является:

$_POST = array_map("mysql_real_escape_string", $_POST);

Потому что реально большинство приложений никогда не переписываются для использования более современных API баз данных.

 6
Author: mario, 2011-02-04 09:39:35

Прежде всего, вам следует проверить настройки php.ini, особенно такие, как register_globals, magic_quotes_gpc - это может нарушить логику ваших приложений.

 5
Author: Distdev, 2011-02-04 09:37:25

Если вы включите error_reporting и установите для него значение E_ALL, то вы сможете увидеть устаревшие ошибки и т.д. Я бы не стал беспокоиться о том, чтобы нацелиться на PHP5.2, а затем на 5.3.

Зависит от того, хотите ли вы, чтобы приложения просто работали, или хотите воспользоваться преимуществами новых функций PHP и улучшений производительности. Если им просто нужно работать, то исправляйте только ошибки и игнорируйте предупреждения E_DEPRECATED и E_NOTICE.

Если проекты были написаны достойным образом с самого начала, то обновление не должно быть слишком сложным их.

Это не значит, что это не будет ужасно скучной и тяжелой работой. Это также займет гораздо больше времени, чем вы ожидаете, особенно для 50 приложений!

 3
Author: Treffynnon, 2011-02-04 09:40:20

Выключите display_errors, включите log_errors, установите error_reporting на -1 и обратите внимание на предупреждения E_STRICT и E_DEPRECATED.

Этот сценарий миграции (бесстыдный плагин) может помочь вам с некоторыми устаревшими вещами. Там написано с 5.2 по 5.3, но может быть полезно и для перехода с 4. И вы можете расширить его (приветствуются исправления:) для вещей, с которыми вы часто сталкиваетесь.

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

Что касается вашего последнего вопроса: ИМХО, вам следует выбрать 5.3, выполнение работы дважды имеет мало смысла.

 3
Author: StasM, 2011-02-04 09:56:22