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