Изменения, повлекшие за собой обратную несовместимость
Несмотря на то, что большинство кода на 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/1.1. Пожалуйста, обратитесь к » ошибке #23610 для получения дальнейший информации,
а также посмотрите описание $_SERVER['PATH_TRANSLATED']
в данном руководстве. Это изменение также имеет место в PHP
версий >= 4.3.2.
Константа T_ML_COMMENT больше
не объявляется расширением Tokenizer. Если
директива error_reporting установлена в E_ALL, PHP
сгенерирует предупреждение. Несмотря на то, что
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 файл включается только
один раз.
Передача массива в функцию по значению больше не сбрасывает
внутренний указатель массива, используемый для доступа к его
элементам в данной функции. Иными словами, в PHP 4 при передаче
массива в функцию его внутренний указатель сбрасывался внутри функции,
тогда как в PHP 5 при передаче массива в функцию данный
указатель останется в том же положении, в котором он был
до передачи массива в функцию.
Пример #1 strrpos() и strripos() теперь
используют в качестве искомого параметра (needle) всю строку