Изменения, повлекшие за собой обратную несовместимость
Несмотря на то, что большинство кода на 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 { }
?>
|
|