Изменения, нарушающие обратную совместимость


Хотя большая часть существущего кода на 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 */
    ?>
    Даже с методом __toString() объекты не могут использоваться для индексации массива. Возможно, позднее будет реализовано встроенное хэширование для таких случаев, но в PHP 5.2.x вам придется реализовать собственное вычисление хэш-значений или использовать новую функцию SPL: spl_object_hash(). Из метода __toString() нельзя бросать исключения.
    <?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.