Изменения, нарушающие обратную совместимость
Хотя большая часть существующего кода на PHP 5 должна работать без изменений, нужно обратить внимание на следующие нарушения обратной совместимости:
-
getrusage() возвращает
null
, если переданы несовместимые аргументы, начиная с PHP 5.2.1. -
ZipArchive::setCommentName()
возвращает
true
при удачном выполнении, начиная с PHP 5.2.1. -
ZipArchive::setCommentIndex()
возвращает
true
при удачном выполнении, начиная с PHP 5.2.1. - SplFileObject::getFilename() возвращает имя файла, а не относительный/путь/к/файлу, начиная с PHP 5.2.1.
- Изменен приоритет переменной окружения PHPRC в Win32. Переменная окружения PHPRC имеет теперь больший приоритет, чем путь, сохраненный в реестре Windows.
- CLI SAPI больше не проверяет текущую директорию на наличие php.ini или php-cli.ini. В PHP 5.1.x существовала недокументированная особенность: исполняемый файл CLI проверял текущую директорию на наличие конфигурационного файла PHP. Это потенциально могло привести к непредсказуемому поведению в случае, если был найден нежелательный конфигурационный файл. Эта функциональность была удалена в версии 5.2.0 и PHP более не ищет в текущей директории файлы php.ini или php-cli.ini. См. также раздел "Командная строка" данного руководства.
-
Добавлено предупреждение при поиске остатка от деления на 0.
В предыдущих версиях PHP выполнение операции "integer % 0" не вызывало
никаких предупреждений. Результатом операции было значение
false
. Начиная с PHP 5.2.0 эта операция вызоветE_WARNING
, как и в любом другом случае деления на 0.<?php
print 10 % 0;
/* Warning: Division by zero in filename on line n */
?> -
__toString() вызывается в
случаях преобразования в строку.
"Магический" метод __toString()
вызывается в строковом контексте, то есть во всех случаях, когда
объект используется как строка.
В версии PHP 5.2.0 была удалена функциональность по умолчанию,
возвращавшая строку с идентификатором объекта. Эта функциональность
вызывала проблемы, поскольку идентификатор в общем случае не уникален.
Это изменение означает, что ваше приложение будет вести себя неправильно,
если оно полагается на идентификатор объекта в виде возвращаемого значения.
Попытка использовать это значение как строку вызовет перехватываемую
фатальную ошибку.
<?php
class foo {}
$foo = new foo;
print $foo;
/* Catchable fatal error: Object of class foo could
not be converted to string in filename on line n */
?><?php
class foo {
public function __toString() {
throw new Exception;
}
}
try {
print new foo;
/* Fatal error: Method foo::__toString() must
not throw an exception in filename on line n */
} catch(Exception $e) {}
?> -
Не поддерживаются абстрактные статические методы классов.
По недосмотру, PHP 5.0.x и 5.1.x позволяли определять абстрактные
статические методы классов. Начиная с PHP 5.2.x такие методы могут быть
только у интерфейсов.
<?php
abstract class foo {
abstract static function bar();
/* Strict Standards: Static function foo::bar()
should not be abstract in filename on line n */
}
?> - Расширение Oracle требует как минимум Oracle 10 под Windows.
-
Добавлена поддержка RFC2397 (
data:
stream). Добавление URL-схемы "data" может потенциально привести к нарушению работы кода под Windows. Если вы работаете с файловой системой NTFS, используете мета-потоки и ваше приложение работает с файлом "data:" не указывая путь к нему, это вызовет ошибку. Чтобы исправить её, используйте протокол "file:" для доступа к файлу. См. также » RFC 2397<?php
/* При allow_url_include равной OFF (по умолчанию) */
include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
/* Warning: include(): URL file-access is disabled
in the server configuration in filename on line n */
?> -
Регрессия в шаблонах
glob()
В версии 5.2.4 исправление безопасности привело к регрессии для шаблонов вида "/foo/*/bar/*". Начиная с версии 5.2.5 функцияglob()
больше не будет выдавать предупреждение, а возвратитfalse
, если нарушены ограниченияopenbase_dir
.