Изменения, нарушающие обратную совместимость
Хотя большая часть существущего кода на 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.
- Изменения в PHP 5.2.x
- Изменения, нарушающие обратную совместимость
- Новые сообщения об ошибках
- Changes in PHP datetime support
- Новые параметры
- Новые функции
- Новые методы
- Удаленные расширения
- Новые расширения
- Новые классы
- Новые глобальные константы
- Новые константы классов
- Новые конфигурационные параметры INI
- Сообщения об ошибках
- Другие улучшения
Коментарии
It should be noted that if you provide a __toString method, you can cast the object to a string and use it as an array key (PHP 5.2.x).
e.g. $array[ (string)$myObject ] = 'foobar';
This is an alternative to using spl_object_hash.
Between PHP 5.2.3 and 5.2.4 another backward incompatible change was introduced: parent classes now can not access private properties of child classes with get_object_vars(). See the following example:
class Bar {
public function dumpBar() {
var_dump(get_object_vars($this));
}
}
class Foo extends Bar {
public $public = 'public';
protected $protected = 'protected';
private $private = 'private';
public function dump() {
var_dump(get_object_vars($this));
}
}
$foo = new Foo();
$foo->dump();
$foo->dumpBar();
The result with PHP < 5.2.4:
E:\php\tests>php get_object_vars.php
array(3) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
["private"] => string(7) "private"
}
array(3) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
["private"] => string(7) "private"
}
And the result with PHP >= 5.2.4:
E:\php-5.2.4-Win32>php ../php/tests/get_object_vars.php
array(3) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
["private"] => string(7) "private"
}
array(2) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
}
As you can see the private property is missing now when dumped from the parent class Bar.
If any of your code relies on includes of URLS à la allow_url_fopen, be aware that a new directive (allow_url_include) has been added, and that it defaults to Off.
If the sole reason for having "abstract static methods" is to force the implementation of such a method in a child, consider using an interface for them. The abstract class implements the interface, and a child class extends the base class and defines the "abstract static methods".
<?php
interface I
{
static public function f();
}
abstract class C implements I
{
// more/other methods go here
}
class D extends C
{
static public function f()
{
echo 'I am f().';
}
}
?>
str_pad has been modified as well, to enforce UPPERCASE sensitivity on the pad_type declaration.
Optional argument pad_type can be STR_PAD_RIGHT, STR_PAD_LEFT, or STR_PAD_BOTH. If pad_type is not specified it is assumed to be STR_PAD_RIGHT.
If entered as:
$foo = 10;
$wrong = str_pad($foo, 4,'0',str_pad_left);
print "wrong is '$wrong'<br>";
$right = str_pad($foo,4,'0',STR_PAD_LEFT);
print "right is '$right'<br>";
results:
wrong is ' '
right is ' 10'