Несмотря на то, что большинство кода на PHP 4 должно работать безо
всяких изменений, вам следует обратить вимание на следующие
изменения, повлекшие за собой обратную несовместимость:
Неправильное использование смещения внутри строки вызывает
E_ERROR вместо E_WARNING.
Пример неправильного использования:
$str = 'abc'; unset($str[0]);.
array_merge() изменена таким образом, что принимает
в качестве аргумента только массивы. Если была передана переменная,
не являющаяся массивом, будет сгенерированна ошибка
E_WARNING для каждого такого параметра. Будьте
внимательны, потому что ваш код может вдруг начать генерировать
ошибки E_WARNING.
Переменная сервера PATH_TRANSLATED больше не определяется неявно под
Apache2 SAPI, в отличие от ситуации в PHP 4, где ей присваивается то же
значение, что и переменной сервера SCRIPT_FILENAME, когда она
не определяется Apache. Это изменение было сделано для соответствия спецификации CGI. Пожалуйста, обратитесь к ошибке #23610 для получения дальнейший информации,
а также посмотрите описание
$_SERVER['PATH_TRANSLATED'] в данном руководстве. Это изменение
также имеет место в PHP версий >= 4.3.2.
Константа T_ML_COMMENT больше
не объявляется расширением Tokenizer. Если
директива error_reporting установлена в E_ALL, PHP
сгенерирует ошибку уровня E_NOTICE. Несмотря на то,
что T_ML_COMMENT не использовалась вообще, она
была объявлена в PHP 4. Как в PHP 4, так и в PHP 5
// и /* */ определяются как T_COMMENT.
Так или иначе, комментарии /** */ в стиле PHPDoс, которые начиная с PHP
5 анализируются PHP, распознаются как T_DOC_COMMENT.
Суперглобальный массив $_SERVER будет создан вместе с переменными argc и argv,
если variables_order включает "S". Если
вы сконфигурировали интерпретатор таким образом, что $_SERVER не
создаётся, тогда, конечно, её не будет. Изменение заключается в том, чтобы
сделать argc и argv всегда доступными в CLI-версии, вне зависимости от variables_order. Как уже было сказано,
CLI-версия теперь всегда будет объявлять переменные $argc и $argv.
Объект без свойств больше не считается "пустым".
В некоторых случаях класс должен быть объявлен перед использованием. Это
происходит только в том случае, если используются некоторые новые функции PHP 5.
Иначе поведение остается старым.
get_class(), get_parent_class()
и get_class_methods() теперь возвращают имя
классов/методов так, как они были объявлены (с учетом регистра), что
может привести к проблемам со старыми скриптами, которые полагаются на
прежнее поведение (имя класса/метода всегда было приведено к нижнему регистру).
Возможным решением является поиск этих функций в ваших скриптах и добавление перед ними
strtolower().
Изменения относительно регистрозависимости также затрагивают
магические
константы__CLASS__,
__METHOD__ и __FUNCTION__.
Значения возвращаются в именно таком виде, в каком они обявлены (с учетом регистра).
ip2long() теперь возвращает FALSE, а не -1, когда
в качестве аргумента функции передается неправильный IP-адрес.
Если во включенном файле объявлены какие-либо функции, они могут использоваться и в
главном файле, вне зависимости от того, располагаются они до return() или после.
Если файл включается дважды, PHP 5 генерирует фатальную ошибку, так как функции уже были объявлены,
в то время, как PHP 4 не жалуется на это.
Рекомендуется использовать include_once() вместо проверки, был ли уже включен файл
и условного возврата внутри включенного файла.
include_once() и require_once()
сначала стандартизируют путь к включенному файлу в Windows, так что при включении
A.php и a.php файл включается только один раз.