Что изменилось в PHP 5
CLI и CGI
Миграция с PHP 4 на PHP 5
PHP Manual

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

Несмотря на то, что большинство кода на 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 файл включается только один раз.

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

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

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

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

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

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

Что изменилось в PHP 5
CLI и CGI
Миграция с PHP 4 на PHP 5
PHP Manual