Несмотря на то, что большинство кода на 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 4 на PHP 5 | Уровень выше | CLI и CGI |