Руководство по PHP
Пред. | Приложение B. Миграция с PHP 4 на PHP 5 | След.

# Изменения, повлекшие за собой обратную несовместимость

Несмотря на то, что большинство кода на PHP 4 должно работать безо всяких изменений, вам следует обратить вимание на следующие изменения, повлекшие за собой обратную несовместимость:

- Несколько новых зарезирвированных ключевых слов.

- strrpos() и strripos() теперь используют всю строку как needle.

- Неправильное использование смещения внутри строки вызывает `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 файл включается только один раз.

Пример B-1. strrpos() и strripos() теперь используют всю строку как needle

`<?php var_dump(strrpos('ABCDEF','DEF')); //int(3) var_dump(strrpos('ABCDEF','DAF')); //bool(false) ?>`

Пример B-2. Объект без свойств больше не считается "пустым"

`<?php class test { } $t = new test(); var_dump(empty($t)); // echo bool(false) if ($t) { // Будет выполнено } ?>`

Пример B-3. В некоторых случаях классы должны быть объявлены перед использованием

`<?php //работает без ошибок: $a = new a(); class a { } //вызывает ошибку: $a = new b(); interface c{ } class b implements c { } ?>`

Пред. | Начало | След.
Миграция с PHP 4 на PHP 5 | Уровень выше | CLI и CGI