Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 463 · Официальная база → практическое применение

Миграции PHP 8.4–8.5: современная объектная модель и новые выражения

Полная карта официальных страниц перехода PHP 8.3 → 8.4, PHP 8.4 → 8.5, дополненная проверяемым порядком обновления.

PHP 8.3 → 8.4

Этот узел — контрольная карта перехода PHP 8.3 → 8.4. Начинают не с переписывания всего проекта, а с инвентаризации runtime, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.

Безопасный порядок обновления
  1. Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
  2. Прочитать несовместимости и deprecation именно для следующего шага.
  3. Поднять новую версию рядом, выполнить тесты и сравнить ответы.
  4. Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Миграция с PHP 8.3.x на PHP 8.4.x

Новая минорная версия приносит ряд новых функций и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.1.x, 7.2.x, 7.3.x, 7.4.x, 8.0.x, 8.1.x, 8.2.x, 8.3.x.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Migrating from PHP 8.3.x to PHP 8.4.x

This new minor version brings with it a number of new features and a few incompatibilities that should be tested for before switching PHP versions in production environments.

See also the migration guides for PHP versions 7.1.x, 7.2.x, 7.3.x, 7.4.x, 8.0.x, 8.1.x, 8.2.x, 8.3.x.

ШагЧто зафиксировать до изменения
СредаPHP, SAPI, расширения, php.ini, ОС и библиотеки.
ПоведениеТесты на реальные входы, ошибки, сериализацию и ответы API.
Зависимостиcomposer.lock, системные пакеты и внешние службы.
ВозвратРезервная копия, совместимая схема данных и команда отката.

PHP 8.3 → 8.4: Новые возможности языка и платформы

Страница отвечает на вопрос «что нового можно применять после обновления». Новая запись не должна случайно попасть в код, который ещё запускается на старом runtime: минимальную версию фиксируют в Composer и проверяют в CI.

Полный официальный договор страницы — большой справочник, раскрывается по запросу

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Ядро PHP

Хуки для свойств объектов

Операциям чтения и записи свойств объектов теперь разрешили добавлять логику поведения. Дополнительную логику добавляют через хук get, который срабатывает при чтении свойства, и хук set, который срабатывает при записи значения в свойство объекта. Хуки умеют делать свойства виртуальными — без реальных значений.

<?php

class Person
{
    // «Виртуальное» свойство. Установить его значение явным образом нельзя
    public string $fullName
    {
        get => $this->firstName . ' ' . $this->lastName;
    }

    // Каждая операция записи значения свойства пройдёт через хук. В свойство в итоге запишется значение, которое вернётся из хука.
    // Доступ к свойству для чтения значения проходит в стандартном режиме
    public string $firstName
    {
        set => mb_ucfirst(strtolower($value));
    }

    // Каждая операция записи значения свойства пройдёт через хук, который сам запишет реальное значение свойства.
    // Доступ к свойству для чтения значения проходит в стандартном режиме
    public string $lastName
    {
        set {
            if (strlen($value) < 2) {
                throw new \InvalidArgumentException('Слишком короткая фамилия');
            }

            $this->lastName = $value;
        }
    }
}

$p = new Person();

$p->firstName = 'пётр';
print $p->firstName; // Конструкция выведет "Пётр"

$p->lastName = 'Петров';
print $p->fullName; // Конструкция выведет "Пётр Петров"

$p->fullName = "Пётр 'Петя' Петров"; // Выбросит ошибку Error: "Property Person::$fullName is read-only"

?>

Асимметричная видимость свойств объектов

Видимостью свойств объектов для операций записи значения — set теперь разрешили управлять отдельно от видимости свойств для операций чтения — get.

<?php

class Example
{
    // Первый модификатор управляет видимостью свойства для чтения, второй — видимостью для записи.
    // Видимость для чтения нельзя сужать сильнее видимости для записи
    public protected(set) string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }
}

?>

Ленивые объекты

С PHP 8.4.0 разрешили создавать объекты, инициализация которых откладывается до обращения к объекту. За счёт ленивых объектов библиотеки и фреймворки получают доступ к отсрочке получения данных или зависимостей, которые требуются для инициализации.

<?php

class Example
{
    public function __construct(private int $data) {}

    // ...
}

$initializer = static function (Example $ghost): void {
    // Fetch data or dependencies
    $data = getData();

    // Initialize
    $ghost->__construct($data);
};

$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);

?>

Атрибут #[\Deprecated]

Новый атрибут Deprecated помечает функции, методы и константы классов устаревшими. Поведение функциональности, которую пометили устаревшей этим атрибутом, совпадает с поведением механизма устаревания функциональности, которую предоставляет сам PHP. Единственное отличие состоит в том, что вместо кода ошибки E_DEPRECATED PHP выдаст ошибку уровня E_USER_DEPRECATED.

Функциональность самого PHP, которая устарела прежде, обновили и пометили этим атрибутом, что улучшило выдаваемые сообщения об ошибках за счёт включения краткого пояснения.

Разбор HTTP-запросов, метод которых отличается от POST, при передаче многокомпонентного содержимого по стандарту RFC1867

Для разбора multipart-запросов по протоколу HTTP, которые определяет стандарт RFC1867 (multipart) и метод HTTP-запроса которых отличается от метода POST, добавили функцию request_parse_body().

Объединение в цепочку вызовов выражения new без круглых скобок

Выражениям, которыми создают новый объект с аргументами конструктора, теперь доступно разыменование, поэтому такие выражения разрешают по цепочке вызывать методы, получать доступ к свойствам объекта, и обращаться к другим членам объекта без заключения выражения в круглые скобки.

Улучшение отладочной информации об объектах класса WeakReference

Получение отладочной информации об слабых ссылках, которые представляет класс WeakReference, теперь также выведет объект, на который ссылается слабая ссылка, или null, если ссылка больше недействительна.

Улучшение отладочной информации об объектах класса Closure

Вывод магического метода Closure::__debugInfo() теперь включает название функции или метода, который вернул замыкание Closure, а также путь к файлу и строку, на которой определили замыкание.

Определение идентичных символов в разных блоках пространства имён

Выход из пространства имён теперь очищает видимые символы. Это разрешает использовать символ в блоке пространства имён, даже если предыдущий блок пространства имён объявил символ с тем же именем.

Модуль cURL

Функция curl_version() возвращает дополнительное значение feature_list — ассоциативный массив со списком известных функций cURL, и поддерживаются ли они: true, если да, или false, если нет.

Добавили константы CURL_HTTP_VERSION_3 и CURL_HTTP_VERSION_3ONLY (доступны с libcurl 7.66 и 7.88) как доступные флаги для опции CURLOPT_HTTP_VERSION.

Добавили константу CURLOPT_PREREQFUNCTION — опция модуля cURL, которая принимает значение с типом callable, которое вызовет после установки соединения, но до отправки запроса. К функции обратного вызова предъявляется требование: вернуть или значение CURL_PREREQFUNC_OK, чтобы разрешить, или значение CURL_PREREQFUNC_ABORT, чтобы прервать запрос.

Добавили опцию CURLOPT_SERVER_RESPONSE_TIMEOUT, которая заменила опцию с названием CURLOPT_FTP_RESPONSE_TIMEOUT. Обе константы содержат одно и то же значение.

Добавили константу CURLOPT_DEBUGFUNCTION — опция модуля cURL, которая принимает значение с типом callable. Callback-функция вызывается в течение жизни запроса, который обрабатывается объектом CurlHandle. Функция обратного вызова получает целое число, которое содержит тип отладочного сообщения, и строку, которая содержит отладочное сообщение. Тип отладочного сообщения получает значение константы из следующего списка:

При установке отладочной опции нельзя устанавливать параметр CURLINFO_HEADER_OUT, потому что параметр использует ту же функциональность библиотеки libcurl.

Функция curl_getinfo() теперь возвращает дополнительный ключ posttransfer_time_us, который содержит количество микросекунд от начала передачи до отправки последнего байта. При перенаправлениях время каждого запроса суммируется. Это значение также возвращает функция curl_getinfo() при вызове с аргументом CURLINFO_POSTTRANSFER_TIME_T для параметра option. Для этого требуется библиотека libcurl 8.10.0 или новее.

Модуль DOM

В модуль добавили пространство имён Dom с новыми классами наподобие Dom\Node, который работает аналогично прежнему классу DOMNode. Новые классы совместимы с языком разметки HTML 5 и соответствуют спецификации WHATWG; новые классы решают давние ошибки в модуле DOM. Старые классы модуля DOM остаются доступны в целях сохранения обратной совместимости.

Добавили метод DOMNode::compareDocumentPosition() и связанные с ним константы:

Метод DOMXPath::registerPhpFunctions() теперь принимает callable-значения. Кроме того, метод DOMXPath::registerPhpFunctionNs() теперь умеет регистрировать callback-функции, которые будут использовать свой синтаксис вызова функции, а не вызовы вроде php:function('name').

Модуль Intl

Режим округления NumberFormatter::ROUND_HALFEVEN дополнили новым режимом NumberFormatter::ROUND_HALFODD.

Модуль OpenSSL

Добавили поддержку ключей на основе эллиптических кривых Curve25519 + Curve448. В частности, поля x25519, ed25519, x448 и ed448 поддерживаются в функциях openssl_pkey_new(), openssl_pkey_get_details(), openssl_sign() и openssl_verify(), которые расширили для поддержки этих ключей.

Реализовали хеширование паролей алгоритмом PASSWORD_ARGON2. Для этого требуется модуль OpenSSL 3.2 и NTS-сборка (англ. сокр.: Non-Thread Safe).

Модуль PCRE

Библиотеку pcre2lib, которая поставляется в комплекте с PHP, обновили до версии 10.44. Поэтому добавили поддержку JIT-компилятором процессорной архитектуры LoongArch, в Perl-совместимых элементах между фигурными скобками разрешили пробелы и теперь поддерживаются ретроспективные проверки переменной длины.

В библиотеке pcre2lib версии 10.44 максимальную длину меток именованных групп захвата изменили с 32 до 128 символов.

Добавили поддержку модификатора r (PCRE2_EXTRA_CASELESS_RESTRICT) и модификатора режима (?r). При включении вместе с модификатором (i), который включает регистронезависимый поиск, выражение блокирует смешивание ASCII-символов и символов, которые не входят в кодировку ASCII.

Модуль PDO

Добавили подклассы, характерные для драйверов, чтобы лучше поддерживать функциональность, специфичную для баз данных. Новые классы модуля PDO улучшают поддержку функциональности, характерной для конкретных баз данных. Новые классы могут быть инициализированы либо с помощью метода PDO::connect(), либо непосредственно инициализировав один из подклассов, характерных для драйверов.

Добавлена поддержка SQL-парсеров, характерных для конкретных драйверов. Если парсер для конкретного драйвера недоступен, используется парсер по умолчанию. Парсер по умолчанию поддерживает:

  • литералы в одинарных и двойных кавычках с удвоением в качестве механизма экранирования
  • комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C

Драйвер PDO_MYSQL

Добавили пользовательский парсер, который поддерживает:

  • литералы в одинарных и двойных кавычках с удвоением и обратным слешем в качестве механизма экранирования
  • литеральные идентификаторы с обратными машинописными апострофами, или обратными кавычками, с удвоением в качестве механизма экранирования
  • комментарии, которые начинаются с двух дефисов, за которыми следует как минимум один пробел, невложенные комментарии в стиле языка C и комментарии, которые начинаются с символа решётки

Драйвер PDO_PGSQL

Добавили пользовательский парсер, который поддерживает:

  • литералы в одинарных и двойных кавычках с удвоением в качестве механизма экранирования
  • «экранирование» строковых литералов в стиле языка C: E'string'
  • строковые литералы между знаками долларов
  • Комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C
  • экранирование оператора ? последовательностью символов ??

Драйвер PDO_SQLITE

Добавили пользовательский парсер, который поддерживает:

  • литералы в одинарных, двойных и обратных кавычках с удвоением в качестве механизма экранирования
  • идентификаторы в квадратных скобках
  • Комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C

Модуль Phar

Добавили поддержку модуля меток времени Unix для Zip-архивов.

Модуль Readline

Добавили поддержку изменения пути .php_history через переменную окружения PHP_HISTFILE.

Модуль SOAP

Добавили поддержку нотации Кларка для пространств имён в карте классов. В карте классов теперь разрешается указывать записи в нотации Кларка, чтобы тип с конкретным пространством имён разрешался в конкретным класс. Например: '{http://example.com}foo' => 'FooClass'.

Экземпляры интерфейса DateTimeInterface, которые передали в xsd:datetime или похожие элементы, теперь сериализуются как таковые, а не как пустая строка.

Сохранение сессий теперь работает с общим модулем сессий.

Стандартные модули

Добавили новое перечисление RoundingMode с понятными названиями и улучшенной по сравнению с константами семейства PHP_ROUND_* обнаруживаемостью. Более того, добавили четыре новых режима округления, которые доступны только через новое перечисление RoundingMode.

Модуль XSL

Разрешили параметры, которые содержат как одинарные, так и двойные кавычки.

В метод XSLTProcessor::registerPhpFunctions() разрешили передавать callable-значения не только в виде строк или массивов, но и в других форматах, которые поддерживает PHP.

Добавили свойства XSLTProcessor::$maxTemplateDepth и XSLTProcessor::$maxTemplateVars для управления глубиной рекурсии при оценке XSL-шаблона.

Модуль Zip

Добавили константу ZipArchive::ER_TRUNCATED_ZIP, которую прежде добавили в библиотеку libzip 1.11.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP Core

Property Hooks

Object properties may now have additional logic associated with their get and set operations. Depending on the usage, that may or may not make the property virtual, that is, it has no backing value at all.

<?php
class Person
{
    // A "virtual" property. It cannot be set explicitly.
    public string $fullName {
        get => $this->firstName . ' ' . $this->lastName;
    }

    // All write operations go through this hook, and the result is what is written.
    // Read access happens normally.
    public string $firstName {
        set => ucfirst(strtolower($value));
    }

    // All write operations go through this hook, which has to write to the backing value itself.
    // Read access happens normally.
    public string $lastName {
        set {
            if (strlen($value) < 2) {
                throw new \InvalidArgumentException('Too short');
            }
            $this->lastName = $value;
        }
    }
}

$p = new Person();

$p->firstName = 'peter';
print $p->firstName; // Prints "Peter"
$p->lastName = 'Peterson';
print $p->fullName; // Prints "Peter Peterson"

$p->fullName = "Peter 'Pete' Peterson"; // Throws Error: "Property Person::$fullName is read-only"

Asymmetric Property Visibility

Object properties may now have their set visibility controlled separately from the get visibility.

<?php
class Example
{
    // The first visibility modifier controls the get-visibility, and the second modifier
    // controls the set-visibility. The get-visibility must not be narrower than set-visibility.
    public protected(set) string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }
}

Lazy Objects

It is now possible to create objects whose initialization is deferred until they are accessed. Libraries and frameworks can leverage these lazy objects to defer fetching data or dependencies required for initialization.

<?php
class Example
{
    public function __construct(private int $data)
    {
    }

    // ...
}

$initializer = static function (Example $ghost): void {
    // Fetch data or dependencies
    $data = getData();
    // Initialize
    $ghost->__construct($data);
};

$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);

#[\Deprecated] attribute

The new Deprecated attribute can be used to mark functions, methods, and class constants as deprecated. The behavior of functionality deprecated with this attribute matches the behavior of the existing deprecation mechanism for functionality provided by PHP itself. The only exception is that the emitted error code is E_USER_DEPRECATED instead of E_DEPRECATED.

Existing deprecations in functionality provided by PHP itself have been updated to use the attribute, improving the emitted error messages by including a short explanation.

Parsing RFC1867 (multipart) requests in non-POST HTTP requests

Added request_parse_body() function that allows parsing RFC1867 (multipart) requests in non-POST HTTP requests.

Chaining new expressions without parentheses

New expressions with constructor arguments are now dereferencable, meaning they allow chaining method calls, property accesses, etc. without enclosing the expression in parentheses.

Improved Debugging Info for WeakReference

Getting the debug info for WeakReference will now also output the object it references, or null if the reference is no longer valid.

Improved Debugging Info for Closure

The output of Closure::__debugInfo() now includes the name, file, and line of the Closure.

Defining Identical Symbols in Different Namespace Blocks

Exiting a namespace now clears seen symbols. This allows using a symbol in a namespace block, even if a previous namespace block declared a symbol with the same name.

cURL

curl_version() returns an additional feature_list value, which is an associative array of all known cURL features, and whether they are supported (true) or not (false).

Added CURL_HTTP_VERSION_3 and CURL_HTTP_VERSION_3ONLY constants (available since libcurl 7.66 and 7.88) as available options for CURLOPT_HTTP_VERSION.

Added CURLOPT_PREREQFUNCTION as a cURL option that accepts a callable to be called after the connection is made, but before the request is sent. This callable must return either CURL_PREREQFUNC_OK or CURL_PREREQFUNC_ABORT to allow or abort the request.

Added CURLOPT_SERVER_RESPONSE_TIMEOUT, which was formerly known as CURLOPT_FTP_RESPONSE_TIMEOUT. Both constants hold the same value.

Added CURLOPT_DEBUGFUNCTION as a cURL option that accepts a callable that gets called during the request lifetime with the CurlHandle object, an integer containing the debug message type, and a string containing the debug message. The debug message type is one of the following constants:

Once this option is set, CURLINFO_HEADER_OUT must not be set because it uses the same libcurl functionality.

The curl_getinfo() now returns an additional posttransfer_time_us key, containing the number of microseconds from the start until the last byte is sent. When a redirect is followed, the time from each request is added together. This value can also be retrieved by passing CURLINFO_POSTTRANSFER_TIME_T to the curl_getinfo()option parameter. This requires libcurl 8.10.0 or later.

DOM

Added the Dom namespace with new classes as counterparts to the existing DOM classes (e.g. Dom\Node is the new DOMNode). These classes are compatible with HTML 5 and are WHATWG spec-compliant; solving long-standing bugs in the DOM extension. The old DOM classes remain available for backwards compatibility.

Added the DOMNode::compareDocumentPosition() with its associated constants:

It is now possible to pass any callable to DOMXPath::registerPhpFunctions(). Furthermore, with DOMXPath::registerPhpFunctionNs(), callbacks can now be registered that will use native function call syntax rather than using php:function('name').

Intl

Added the NumberFormatter::ROUND_HALFODD to complement the existing NumberFormatter::ROUND_HALFEVEN functionality.

OpenSSL

Added support for Curve25519 + Curve448 based keys. Specifically x25519, ed25519, x448 and ed448 fields are supported in openssl_pkey_new(), openssl_pkey_get_details(), openssl_sign(), and openssl_verify() were extended to support those keys.

Implement PASSWORD_ARGON2 password hashing. Requires OpenSSL 3.2 and NTS build.

PCRE

The bundled pcre2lib has been updated to version 10.44. As a consequence, LoongArch JIT support has been added, spaces are now allowed between braces in Perl-compatible items, and variable-length lookbehind assertions are now supported.

With pcre2lib version 10.44, the maximum length of named capture groups has changed from 32 to 128.

Added support for the r (PCRE2_EXTRA_CASELESS_RESTRICT) modifier, as well as the (?r) mode modifier. When enabled along with the case-insensitive modifier (i), the expression locks out mixing of ASCII and non-ASCII characters.

PDO

Added support for driver-specific subclasses in order to better support database-specific functionalities. The new classes are instantiatable either via calling the PDO::connect() method or by instantiating one of the driver-specific subclasses directly.

Added support for driver specific SQL parsers. When a driver-specific parser is not available, the default parser is used. The default parser supports:

  • single and double-quoted literals, with doubling as escaping mechanism
  • two-dashes and non-nested C-style comments

PDO_MYSQL

Added a custom parser supporting:

  • single and double-quoted literals, with doubling and backslash as escaping mechanism
  • backtick literal identifiers and with doubling as escaping mechanism
  • two dashes followed by at least 1 whitespace, non-nested C-style comments, and hash-comments

PDO_PGSQL

Added a custom parser supporting:

  • single and double-quoted literals, with doubling as escaping mechanism
  • C-style "escape" string literals (E'string')
  • dollar-quoted string literals
  • two-dashes and C-style comments (non-nested)
  • support for ?? as escape sequence for the ? operator

PDO_SQLITE

Added a custom parser supporting:

  • single, double-quoted, and backtick literals, with doubling as escaping mechanism
  • square brackets quoting for identifiers
  • two-dashes and C-style comments (non-nested)

Phar

Added support for the Unix timestamp extension for Zip archives.

Readline

Added ability to change the .php_history path through the PHP_HISTFILE environment variable.

SOAP

Added support for clark notation for namespaces in class map. It is now possible to specify entries in a class map with clark notation to resolve a type with a specific namespace to a specific class. For example: '{http://example.com}foo' => 'FooClass'.

Instances of DateTimeInterface that are passed to xsd:datetime or similar elements are now serialized as such instead of being serialized as an empty string.

Session persistence now works with a shared session module.

Standard

Added a new RoundingMode enum with clearer naming and improved discoverability compared to the PHP_ROUND_* constants. Moreover, four new rounding modes were added which are only available via the new RoundingMode enum.

XSL

It is now possible to use parameters that contain both single and double quotes.

It is now possible to pass any callable to XSLTProcessor::registerPhpFunctions().

Added XSLTProcessor::$maxTemplateDepth and XSLTProcessor::$maxTemplateVars to control the recursion depth of XSL template evaluation.

Zip

Added the ZipArchive::ER_TRUNCATED_ZIP constant, which was added in libzip 1.11.

PHP 8.4+: читать свойство публично, менять только внутри классаСамостоятельный пример
<?php
final class Delivery
{
    public private(set) string $status = 'new';

    public function dispatch(): void
    {
        $this->status = 'sent';
    }
}

$delivery = new Delivery();
$delivery->dispatch();
echo $delivery->status, "\n";
Ожидаемый результат
sent

Асимметричная видимость сохраняет удобное чтение, но не разрешает внешнему коду произвольную запись. Она появилась в PHP 8.4.

PHP 8.3 → 8.4: Новые классы, интерфейсы и перечисления

Новые классы, интерфейсы и enum доступны только в указанной ветке PHP или расширения. Перед условной интеграцией проверяют версию и наличие расширения; для обязательной зависимости ранний отказ понятнее тихой деградации.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP 8.3 → 8.4: Новые функции и методы

Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Модуль Opcache

Модуль PDO_PGSQL

Модуль Sodium

  • sodium_crypto_aead_aegis128l_*
  • sodium_crypto_aead_aegis256l_*

Модуль SPL

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Sodium

  • sodium_crypto_aead_aegis128l_*
  • sodium_crypto_aead_aegis256l_*

PHP 8.3 → 8.4: Новые глобальные константы

Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Модуль Intl

  • PATTERN (IntlDateFormatter)
  • PROPERTY_IDS_UNARY_OPERATOR (IntlChar)
  • PROPERTY_ID_COMPAT_MATH_START
  • PROPERTY_ID_COMPAT_MATH_CONTINUE

Модуль libxml

  • LIBXML_RECOVER
  • LIBXML_NO_XXE. Константу указывают вместе с константой LIBXML_NOENT, когда требуется выполнить подстановку сущности и одновременно запретить загрузку внешней сущности. Константа доступна с libxml2 2.13.

Модуль MySQLi

Модуль PCNTL

  • SIGCKPT (работает только в ОС DragonFlyBSD)
  • SIGCKPTEXIT (работает только в ОС DragonFlyBSD)
  • WEXITED
  • WSTOPPED
  • WNOWAIT
  • P_ALL
  • P_PID
  • P_PGID
  • P_PIDFD (работает только в ОС Linux)
  • P_UID (работает только в ОС NetBSD/FreeBSD)
  • P_GID (работает только в ОС NetBSD/FreeBSD)
  • P_SID (работает только в ОС NetBSD/FreeBSD)
  • P_JAILID (работает только в ОС FreeBSD)

Драйвер PGSQL

Модуль Sockets

Следующие параметры сокета получат определение, только если ОС поддерживает параметр:

Модуль XML

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Intl

  • PATTERN (IntlDateFormatter)
  • PROPERTY_IDS_UNARY_OPERATOR (IntlChar)
  • PROPERTY_ID_COMPAT_MATH_START
  • PROPERTY_ID_COMPAT_MATH_CONTINUE

libxml

  • LIBXML_RECOVER
  • LIBXML_NO_XXE. This is used together with LIBXML_NOENT when entity substitution should be performed, while disallowing external entity loading. This constant is available as of libxml2 2.13.

PCNTL

Sockets

The following socket options are now defined if they are supported:

XML

PHP 8.3 → 8.4: Обратно несовместимые изменения

Это обязательный список рисков: прежний код может компилироваться, но вернуть другой тип, выбросить исключение или изменить порядок действий. Каждый относящийся к проекту пункт превращают в отдельный тест до обновления.

Полный официальный договор страницы — большой справочник, раскрывается по запросу

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Каждая новая функция, класс, интерфейс, перечисление или константа станет причиной ошибки Error о повторном объявлении, которую выбросит PHP, если встретит в коде объявление с тем же названием, хотя раздел не указывает это в явной форме.

Ядро PHP

Изменение поведения языковой конструкции exit()

Поведение языковой конструкции exit() и её псевдонима die() теперь больше похоже на функции: их разрешили передавать как значения с типом callable, на поведение функций теперь влияет директива strict_types управляющей конструкции declare и теперь они выполняют стандартные преобразования типов вместо приведения нецелочисленных значений к строке.

Поэтому передача недопустимых типов в функции exit() и die() теперь выбрасывает ошибку TypeError.

Рекурсия при сравнении

Появление рекурсии при сравнении теперь выбрасывает ошибку Error вместо ошибки уровня E_ERROR.

Непрямая модификация доступных только для чтения свойств

Непрямую модификацию доступных только для чтения свойств внутри магического метода __clone() запретили, например, присваивание по ссылке $ref = &$this->readonly вызовет фатальную ошибку. Инициализацию доступных только для чтения свойств запретили раньше и упустили в реализации «повторной инициализации доступных только для чтения свойств при клонировании».

Изменение типа констант

Константы PHP_DEBUG и PHP_ZTS теперь принадлежат логическому типу bool. Раньше константы принадлежали целочисленному типу int.

Длина имени временного файла

Длину названий файлов, которые загрузили, и файлов, которые создали функцией tempnam(), увеличили на 13 байтов. Общая длина по-прежнему зависит от платформы.

Удаление уровня ошибки E_STRICT

Уровень ошибки E_STRICT удалили, поскольку движок PHP больше с ним не работает. Константа E_STRICT устарела.

Типизация констант в классах модулей

Следующие модули теперь объявляют тип для констант своих классах:

Миграция ресурсов в объекты

Ряд ресурсов (resource) перенесли в объекты (object). Значения, которые возвращали функции-создатели ресурсов и которые проверяли функцией is_resource(), потребуется заменить проверками значений возврата таких функций на принадлежность типу false, если только в описании функции не указали иное.

Модуль DBA

Функции модуля DBA теперь принимают и возвращают объекты Dba\Connection вместо ресурсов (resource) dba_connection.

Драйвер ODBC

Функции драйвера ODBC теперь принимают и возвращают объекты Odbc\Result вместо ресурсов (resource) odbc_result.

Функции драйвера ODBC теперь принимают и возвращают объекты Odbc\Connection вместо ресурсов (resource) odbc_connection.

SOAP

Разработчики представили свойство SoapClient::$httpurl объектом Soap\Url, а не ресурсом (resource) soap_url. Проверки функцией is_resource() наподобие is_resource($client->httpurl)) потребуется заменить проверками на null вроде $client->httpurl !== null.

Разработчики представили свойство SoapClient::$sdl объектом Soap\Sdl, а не ресурсом (resource) soap_sdl. Проверки функции is_resource() наподобие is_resource($client->sdl) потребуется заменить проверками на null вроде $client->sdl !== null.

Новые предупреждения и исключения

Разработчики добавили новые предупреждения и исключения, которые срабатывают при ошибках программирования, — когда в аргументах передают недопустимые значения.

Модуль Curl

Функция curl_multi_select() теперь выбрасывает ошибку ValueError, если аргумент timeout меньше 0 или больше значения константы PHP_INT_MAX.

Модуль Gd

Функции imagejpeg(), imagewebp(), imagepng(), imageavif() теперь выбрасывают ошибку ValueError, если в параметр quality передали недопустимое значение.

Функция imageavif() теперь выбрасывает ошибку ValueError, если в параметр speed передали недопустимое значение.

Функция imagescale() теперь выбрасывает ошибку ValueError, если ширина width или высота height выходит за пределы допустимых значений: недополнено или переполнено.

Функция imagescale() теперь выбрасывают ошибку ValueError, если передали недопустимое значение в параметр mode.

Функция imagefilter() с фильтром IMG_FILTER_SCATTER теперь выбрасывают ошибку ValueError, если значение вычитания sub или добавления plus эффекта выходит за пределы допустимых значений: недополнено или переполнено.

Модуль Gettext

Функции bind_textdomain_codeset(), textdomain(), d*gettext теперь выбрасывают ошибку ValueError, если в аргументе domain передали пустую строку.

Модуль Intl

Функции resourcebundle_get(), ResourceBundle::get() и обращение к смещениям объекта ResourceBundle теперь выбрасывают исключение:

  • TypeError при недопустимых типах смещения
  • ValueError при передаче пустой строки (string)
  • ValueError, если целочисленный индекс не помещается в 32-битное целое число со знаком

Метод IntlDateFormatter::__construct() теперь выбрасывает ошибку ValueError, если в параметр locale передали недопустимое значение.

Метод NumberFormatter::__construct() теперь выбрасывает ошибку ValueError, если в параметр locale передали недопустимое значение.

Модуль MBString

Теперь функции mb_encode_numericentity() и mb_decode_numericentity() проверяют, что значение параметра map состоит только из целых числел (int), иначе выбрасывают ошибку ValueError.

Теперь функция mb_http_input() выбрасывает ошибку ValueError при каждом вызове, если в параметр type передали недопустимое значение.

Теперь функция mb_http_output() проверяет, что значение параметра encoding не содержит нулевых байтов, иначе выбрасывает ошибку ValueError.

ODBC

Функция odbc_fetch_row() раньше возвращала значение false, если значение аргумента row оказывалось меньше или равно 0. Теперь функция выдаёт предупреждение.

Модуль PCNTL

Функции pcntl_sigprocmask(), pcntl_sigwaitinfo() и pcntl_sigtimedwait() теперь выбрасывают исключение:

  • ValueError, если массив signals оказался пустым (за исключением функции pcntl_sigprocmask(), если для параметра mode установили режим SIG_SETMASK)
  • TypeError, если массив signals содержит значение, которое не принадлежит типу int
  • ValueError, если массив signals содержит значение, которое оказалось недопустимым номером сигнала

Функция pcntl_sigprocmask() теперь выбрасывает ошибку ValueError, если в аргументе mode передали значение, которое не входит в список: SIG_BLOCK, SIG_UNBLOCK или SIG_SETMASK.

Функция pcntl_sigtimedwait() теперь выбрасывает ошибку:

  • ValueError, если значение аргумента seconds меньше 0
  • ValueError, если значение аргумента nanoseconds меньше 0 или больше 1e9
  • ValueError, если значения аргументов seconds и nanoseconds равны 0

Модуль Session

Установка неположительного значения в директиве session.gc_divisor или отрицательного значения в директиве session.gc_probability теперь выдаёт предупреждение.

Модуль SimpleXML

Вызов функции simplexml_import_dom() не с XML-объектом теперь вместо исключения ValueError выбрасывает ошибку TypeError.

Новые исключения и ошибки в стандартных функциях

Функция round() теперь проверяет значение параметра mode и выбрасывает ошибку ValueError для недопустимых режимов. Раньше функция интерпретировала недопустимые режимы округления как режим PHP_ROUND_HALF_UP.

Функция str_getcsv() теперь выбрасывает ошибку ValueError, когда длина разделителя separator и ограничителя полей enclosure не равна одному байту, или если в аргументе символа экранирования escape не передали однобайтовый символ или пустую строку. Это выравнивает поведение функции, чтобы оно было идентично поведению функций fputcsv() и fgetcsv().

Функция php_uname() теперь выбрасывает ошибку ValueError, если значение аргумента mode недопустимо.

Опция "allowed_classes" функции unserialize() теперь выбрасывает ошибку TypeError или ValueError, если в аргументе передали не массив (array) названий классов и не логическое значение (bool).

Класс XMLReader

Передача недопустимой кодировки символов в метод XMLReader::open() или XMLReader::XML() теперь выбрасывает ошибку ValueError.

Передача строки (string), которая содержит нулевые байты, раньше выдавала предупреждение, а теперь выбрасывает ошибку ValueError.

Класс XMLWriter

Передача строки (string), которая содержит нулевые байты, раньше выдавала предупреждение, а теперь выбрасывает ошибку ValueError.

Модуль XSL

Метод XSLTProcessor::setParameter() теперь выбрасывает ошибку ValueError, если значения аргументов содержат нулевые байты. Метод никогда не работал корректно, поэтому теперь такое поведение приводит к исключению.

Вызов метода XSLTProcessor::importStyleSheet() не с XML-объектом теперь вместо исключения ValueError выбрасывает ошибку TypeError.

Невозможность вызвать callback-функцию во время оценки теперь выбрасывает исключение, а не выдаёт предупреждение.

Date

Синтаксис относительных форматов снова принимает в символах number множественные знаки числа: +-2.

Модуль DOM

Отдельные методы модуля DOM раньше возвращали значение false или выбрасывали исключение DOMException с кодом DOM_PHP_ERR, если не получалось выделить новый узел. Теперь методы постоянно выбрасывают исключение DOMException с кодом DOM_INVALID_STATE_ERR. Такая ситуация в крайней степени маловероятна и вряд ли затронет прежний код. В итоге вместо типа DOMDocument|false методу DOMImplementation::createDocument() назначили предварительный тип возврата DOMDocument.

Раньше объекты DOMXPath разрешали клонировать, но в итоге получался непригодный объект. Клонирование объекта DOMXPath больше невозможно и теперь выбрасывает ошибку Error.

Метод DOMImplementation::getFeature() удалили.

Класс GMP

Класс GMP сделали окончательным и поэтому расширение класса теперь невозможно.

Модуль MBString

Начиная с PHP 8.3.2 в недопустимых строках с ошибками кодировки функции mb_substr() и mb_strstr() интерпретируют индексы символов аналогично большей части других функций для работы с многобайтовыми строками. Поэтому символьные индексы, которые возвращает функция mb_strpos(), разрешили передавать в функцию mb_substr().

Для строк в кодировке SJIS-mac, или её псевдониме MacJapanese, эти индексы символов ссылаются на индексы кодовых точек кодировки Unicode, которые получаются при преобразовании строки в Unicode, а они отличаются от индексов символов кодировки SJIS-mac, которые преобразовываются в последовательность из нескольких кодовых точек.

Модуль MySQLi

Невостребованную и незадокументированную константу MYSQLI_SET_CHARSET_DIR удалили.

Константу MYSQLI_STMT_ATTR_PREFETCH_ROWS удалили. Функция недоступна в драйвере mysqlnd.

Константы MYSQLI_CURSOR_TYPE_FOR_UPDATE и MYSQLI_CURSOR_TYPE_SCROLLABLE удалили. Этот функционал никогда не реализовывали ни в драйвере mysqlnd, ни в библиотеке libmysql.

Невостребованную константу MYSQLI_TYPE_INTERVAL — заглушку и псевдоним константы MYSQLI_TYPE_ENUM — удалили.

Драйвер MySQLnd

Код ошибки, которым сообщают о превышении времени ожидания сервера MySQL, изменили с 2006 на 4031 для серверов MySQL версии 8.0.24 и выше.

Модуль Opcache

Максимальное значение директивы opcache.interned_strings_buffer в 64-разрядных архитектурах теперь составляет 32767 МБ. Раньше значение составляло 4095 мегабайтов.

Компилятор JIT

Значения конфигурации по умолчанию для JIT-компилятора изменились с opcache.jit=tracing на opcache.jit=disable и с opcache.jit_buffer_size=0 на opcache.jit_buffer_size=64M.

Это не влияет на поведение наблюдаемых объектов по умолчанию, поскольку JIT по-прежнему отключён по умолчанию. Однако теперь JIT-компиляция отключается параметром opcache.jit, а не opcache.jit_buffer_size. Изменение затронет пользователей, которые раньше включали JIT только директивой opcache.jit_buffer_size, но не указывали режим JIT-компиляции в директиве opcache.jit. Поэтому чтобы включить JIT-компиляцию потребуется указать значение конфигурации для директивы opcache.jit.

Теперь при включённой JIT-компиляции PHP будет завершаться с критической ошибкой при запуске, если инициализация JIT-компилятора по какой-либо причине не удалась.

Модуль PCNTL

Функции pcntl_sigprocmask(), pcntl_sigwaitinfo() и pcntl_sigtimedwait() теперь при каждом вызове возвращают значение false, если возникла ошибка. Раньше в отдельных случаях функции иногда возвращали значение -1.

Модуль PCRE

Библиотеку pcre2lib, которая идёт в комплекте поставки, обновили до версии 10.44. Поэтому запись {,3} теперь распознается как квантификатор, а не как текст. Кроме того, изменилось значение отдельных классов символов в режиме UCP. Полный перечень изменений приводит » список изменений PCRE2.

Драйвер PDO_DBLIB

Атрибуты Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER и Pdo\Dblib::ATTR_DATETIME_CONVERT теперь действуют как логические атрибуты вместо целочисленных. Поэтому установка атрибута методом PDO::setAttribute() и получение атрибута методом PDO::getAttribute() ожидает и возвращает логическое значение (bool).

Драйвер PDO_FIREBIRD

Атрибут PDO::ATTR_AUTOCOMMIT теперь действует как логический атрибут вместо целочисленного. Поэтому установка атрибута методом PDO::setAttribute() и получение атрибута методом PDO::getAttribute() ожидает и возвращает логическое значение (bool).

Модуль теперь раскрывает отдельные API-интерфейсы СУБД Firebird на языке C++, поэтому для сборки модуля теперь требуется компилятор C++. Более того, теперь модуль потребуется скомпилировать с библиотекой fbclient 3.0 или выше.

Драйвер PDO_MYSQL

Атрибуты PDO::ATTR_AUTOCOMMIT, PDO::ATTR_EMULATE_PREPARES и PDO::MYSQL_ATTR_DIRECT_QUERY теперь действуют как логические атрибуты вместо целочисленных. Поэтому установка атрибута методом PDO::setAttribute() и получение атрибута методом PDO::getAttribute() ожидает и возвращает логическое значение (bool).

Драйвер PDO_PGSQL

Приоритет учётных данных, которые указали в DSN-строке подключения конструктора класса PDO, выше, чем приоритет учётных данных, которые указали во втором и третьем аргументах конструктора, поскольку учётные данные в DSN-строке подключения ближе к положениям документации.

Модуль SimpleXML

Объект класса SimpleXMLElement — представляет не только элемент в XML-документе, но и интерфейс RecursiveIterator. До PHP 8.4.0 отдельные методы класса наподобие SimpleXMLElement::asXML() или SimpleXMLElement::getName() и приведение таких экземпляров к строке (string) неявно сбрасывали итератор.

Такое поведение иногда делало циклы бесконечными, поскольку итератор отматывался к первому элементу. Приведём пример. Следующий код:

<?php

$xmlString = "<root><a><b>1</b><b>2</b><b>3</b></a></root>";
$xml = simplexml_load_string($xmlString);

$nodes = $xml->a->b;
foreach ($nodes as $nodeData) {
    echo "Данные узла: " . $nodeData . "\n";

    $xml = $nodes->asXml();
}

…вызовет бесконечный цикл.

Данные узла: 1
Данные узла: 2
Данные узла: 2
Данные узла: 2
Данные узла: 2
Данные узла: 2
Данные узла: 2
// ...

Это поведение исправили, и элемент SimpleXMLElement больше не будет неявно сбрасывать данные итератора, если только итератор не отмотают вручную. Поэтому приведённый пример теперь будет выводить следующие данные:

Данные узла: 1
Данные узла: 2
Данные узла: 3

Модуль SOAP

Разработчики представили свойство SoapClient::$typemap массивом (array), а не ресурсом (resource). Проверки функцией is_resource() наподобие is_resource($client->typemap) потребуется заменить проверкой на null вроде $client->typemap !== null.

Модуль SOAP получил необязательную зависимость от модуля session. Теперь при запуске будут возникать ошибки, если включить модуль SOAP, а PHP собрать без модуля session, но с флагом конфигурации --enable-rtld-now. Проблему решают двумя способами: либо не включают режим rtld-now, либо загружают модуль сессий.

Стандартные функции

Теперь при вызове функции strcspn() с передачей в аргументе characters пустой строки вместо неправильной остановки на первом нулевом байте возвращается длина строки.

Функция http_build_query() теперь корректно обрабатывает типизированные перечисления.

Функции stream_bucket_make_writeable() и stream_bucket_new() теперь возвращают экземпляр класса StreamBucket, а не класса stdClass.

Модуль Tidy

Теперь вместо предупреждений и повреждения объекта сбои в конструкторе выбрасывают исключение.

Парсер XML

Функции семейства xml_set_*_handler теперь объявляют и проверяют сигнатуру callable|string|null параметров handler. Больше того, значения с типом string, которые соответствуют названиям методов, которые задали функцией xml_set_object(), теперь проверяются на существование метода в классе объекта, который передали прежде. Поэтому теперь перед установкой названий методов, которые устанавливаются как callable-обработчики, требуется каждый раз вызывать функцию xml_set_object(). Передача пустой строки для отключения обработчика по-прежнему разрешается, но устарела.

Однако, поскольку функция xml_set_object() и передача строк, которые не принадлежат типу callable, устарели, рекомендуют заменить такие экземпляры callable-обработчиками, которые ссылаются непосредственно на метод.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Although not explicitly stated in this section, every new function, class, interface, enum, or constant may cause a redeclaration Error to be thrown.

PHP Core

exit() behavioral change

The exit() (and die()) language constructs now behave more like a function. This means that they can now be passed like callables, are affected by the strict_types declare statement, and now perform the usual type coercions instead of casting any non-integer value to a string.

As such, passing invalid types to exit() and die() now consistently result in a TypeError being thrown.

Recursion during comparison

Encountering recursion during comparison now results in an Error exception instead of a E_ERROR fatal error.

Indirect Modification of readonly Properties

Indirect modification of readonly properties within __clone() is no longer allowed, e.g. $ref = &$this->readonly. This was already forbidden for readonly initialization, and was an oversight in the "readonly reinitialization during cloning" implementation.

Type Change of Constants

The PHP_DEBUG and PHP_ZTS constants are now of type bool. Previously they were of type int.

Temporary Filename Length

The name of uploaded files and files created by the tempnam() function are now 13 bytes longer. The total length is still platform-dependent.

Removal of E_STRICT error level

The E_STRICT error level has been removed, as it was no longer in use within the PHP engine. The E_STRICT constant has been deprecated.

Extension Class Constants which are now Typed

The following extension class constants now declare a type on their constants:

Resource to Object Migration

Several resources have been migrated to objects. Return value checks using is_resource() should be replaced with checks for false, unless specified otherwise.

DBA

The DBA functions now accept and return Dba\Connection objects instead of dba_connectionresources.

ODBC

The ODBC functions now accept and return Odbc\Result objects instead of odbc_resultresources.

The ODBC functions now accept and return Odbc\Connection objects instead of odbc_connectionresources.

SOAP

The SoapClient::$httpurl property is now a Soap\Url object rather than a soap_urlresource. Checks using is_resource() (i.e. is_resource($client->httpurl)) should be replaced with checks for null (i.e. $client->httpurl !== null).

The SoapClient::$sdl property is now a Soap\Sdl object rather than a soap_sdlresource. Checks using is_resource() (i.e. is_resource($client->sdl)) should be replaced with checks for null (i.e. $client->sdl !== null).

New warnings and exceptions

New warnings and exceptions have been added which are triggered on programming errors, i.e. invalid values provided as arguments.

Curl

curl_multi_select() now throws a ValueError if the timeout parameter is less than 0 or greater than PHP_INT_MAX.

Gd

imagejpeg(), imagewebp(), imagepng(), imageavif() now throw a ValueError when an invalid quality is passed.

imageavif() will now throw a ValueError if an invalid speed parameter value is passed.

imagescale() will now throw a ValueError if the width or height parameters underflows/overflows.

imagescale() will now throw a ValueError if an invalid mode parameter value is passed.

imagefilter() will now throw a ValueError with the IMG_FILTER_SCATTER filter if the sub or plus parameters underflows/overflows.

Gettext

bind_textdomain_codeset(), textdomain(), d*gettext now throw a ValueError if domain is the empty string.

Intl

resourcebundle_get(), ResourceBundle::get(), and accessing offsets on a ResourceBundle object now throw:

IntlDateFormatter::__construct() throws a ValueError if the locale is invalid.

NumberFormatter::__construct() throws a ValueError if the locale is invalid.

MBString

mb_encode_numericentity() and mb_decode_numericentity() now check that the map is only composed of ints, if not a ValueError is now thrown.

mb_http_input() now always throw a ValueError if type is invalid.

mb_http_output() now check that the encoding does not contain any null bytes, if it does a ValueError is now thrown.

ODBC

odbc_fetch_row() returns false when row is less than or equal to 0. A warning is now emitted in this case.

PCNTL

The pcntl_sigprocmask(), pcntl_sigwaitinfo(), and pcntl_sigtimedwait() functions now throw:

The pcntl_sigprocmask() function now throws a ValueError if the mode is not one of SIG_BLOCK, SIG_UNBLOCK, or SIG_SETMASK.

The pcntl_sigtimedwait() function now throw:

  • A ValueError if seconds is less than 0
  • A ValueError if nanoseconds is less than 0 or greater than 1e9
  • A ValueError if both seconds and nanoseconds are 0

Session

Setting a non-positive value for session.gc_divisor or a negative value for session.gc_probability now emits a warning.

SimpleXML

Calling simplexml_import_dom() with a non-XML object now throws a TypeError instead of a ValueError.

Standard

The round() function now validates the value of the mode and throw a ValueError for invalid modes. Previously, invalid modes would have been interpreted as PHP_ROUND_HALF_UP.

The str_getcsv() now throws ValueErrors when the separator and enclosure arguments are not one byte long, or if the escape argument is not one byte long nor the empty string. This aligns the behaviour to be identical to the one of fputcsv() and fgetcsv().

The php_uname() function now throws a ValueError if the mode is invalid.

The "allowed_classes" option for unserialize() now throws TypeError and ValueError if it is neither an array of class names nor a bool.

XMLReader

Passing an invalid character encoding to XMLReader::open() or XMLReader::XML() now throws a ValueError.

Passing a string containing null bytes previously emitted a warning and now throws a ValueError.

XMLWriter

Passing a string containing null bytes previously emitted a warning and now throws a ValueError.

XSL

XSLTProcessor::setParameter() will now throw a ValueError when its arguments contain null bytes. This never actually worked correctly in the first place, which is why it throws an exception now.

Calling XSLTProcessor::importStyleSheet() with a non-XML object now throws a TypeError instead of a ValueError.

Failure to call a PHP function callback during evaluation now throws instead of emitting a warning.

Date

number symbols in relative formats once again accept multiple signs, e.g. +-2.

DOM

Some DOM methods previously returned false or a DOMException with code DOM_PHP_ERR if a new node could not be allocated. They now consistently throw a DOMException with code DOM_INVALID_STATE_ERR. This situation is extremely unlikely and the probability of being affected is low. As a result DOMImplementation::createDocument() now has a tentative return type of DOMDocument instead of DOMDocument|false.

Previously, DOMXPath objects could be cloned, but resulted in an unusable object. This is no longer possible, and cloning a DOMXPath object now throws an Error.

The DOMImplementation::getFeature() method has been removed.

GMP

The GMP class is now final and cannot be extended anymore.

MBString

As of PHP 8.3.2, on invalid strings (those with encoding errors), mb_substr() and mb_strstr() interpret character indices in the same manner as most other mbstring functions. This means that character indices returned by mb_strpos() can be passed to mb_substr().

For SJIS-mac (MacJapanese) strings, those character indices refer to the indices of the Unicode codepoints which are produced when the string is converted to Unicode, which differ from the character indices for the SJIS-mac characters that convert to a sequence of several codepoints.

MySQLi

The unused and undocumented constant MYSQLI_SET_CHARSET_DIR has been removed.

The MYSQLI_STMT_ATTR_PREFETCH_ROWS constant has been removed. The feature is unavailable with mysqlnd.

The MYSQLI_CURSOR_TYPE_FOR_UPDATE and MYSQLI_CURSOR_TYPE_SCROLLABLE constants have been removed. This functionality was never implemented, neither with mysqlnd nor with libmysql.

The unused MYSQLI_TYPE_INTERVAL constant, which is currently a stub and an alias for MYSQLI_TYPE_ENUM, has been removed.

MySQLnd

The error code reported for MySQL server wait timeouts has been changed from 2006 to 4031 for MySQL server versions 8.0.24 and above.

Opcache

The maximum value of the opcache.interned_strings_buffer setting on 64bit architectures is now 32767. Previously it was 4095.

JIT

The default configuration values for the JIT changed from opcache.jit=tracing and opcache.jit_buffer_size=0 to opcache.jit=disable and opcache.jit_buffer_size=64M, respectively.

This does not affect the default observable behavior, as the JIT is still disabled by default. However, it is now disabled through the opcache.jit setting, rather than opcache.jit_buffer_size. This may affect users who previously enabled JIT through opcache.jit_buffer_size exclusively, without also specifying a JIT mode using opcache.jit. To enable JIT compilation, set the opcache.jit config value accordingly.

If JIT compilation is enabled, PHP will now exit with a fatal error on startup if the initialization of the JIT compiler failed for any reason.

PCNTL

The pcntl_sigprocmask(), pcntl_sigwaitinfo(), and pcntl_sigtimedwait() functions now always return false on failure. In some case previously it could return the value -1.

PCRE

The bundled pcre2lib has been updated to version 10.44. As a consequence, this means {,3} is now recognized as a quantifier instead of as text. Furthermore, the meaning of some character classes in UCP mode has changed. Consult the » PCRE2 Changelog for a full changelog.

PDO_DBLIB

The Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER and Pdo\Dblib::ATTR_DATETIME_CONVERT attributes now act as boolean attributes instead of integer attributes. Thus setting the attribute via PDO::setAttribute() and retrieving it via PDO::getAttribute() expects and or return a bool.

PDO_FIREBIRD

The PDO::ATTR_AUTOCOMMIT attribute now act as boolean attributes instead of integer attributes. Thus setting the attribute via PDO::setAttribute() and retrieving it via PDO::getAttribute() expects and or return a bool.

The extension now exposes some Firebird C++ APIs, therefore building this extension now requires a C++ compiler. Moreover, the extension must now be compiled against fbclient 3.0 or higher.

PDO_MYSQL

The PDO::ATTR_AUTOCOMMIT, PDO::ATTR_EMULATE_PREPARES, and PDO::MYSQL_ATTR_DIRECT_QUERY attributes now act as boolean attributes instead of integer attributes. Thus setting the attribute via PDO::setAttribute() and retrieving it via PDO::getAttribute() expects and or return a bool.

PDO_PGSQL

The DSN's credentials, when set, are given priority over their PDO constructor counterparts, being closer to the documentation states.

SimpleXML

SimpleXMLElement is not only a representation of an XML element, but it is also a RecursiveIterator. Prior to PHP 8.4.0, some of its methods (e.g. SimpleXMLElement::asXML() or SimpleXMLElement::getName()) and casting such instances to string would implicitly reset the iterator.

This could cause unexpected infinite loops as the iterator was rewound. For example:

<?php

$xmlString = "<root><a><b>1</b><b>2</b><b>3</b></a></root>";
$xml = simplexml_load_string($xmlString);

$nodes = $xml->a->b;
foreach ($nodes as $nodeData) {
    echo "nodeData: " . $nodeData . "\n";

    $xml = $nodes->asXml();
}

would result in an infinite loop.

nodeData: 1
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
// ...

However, this behavior has now been corrected, and a SimpleXMLElement will no longer implicitly reset the iterator data, unless explicitly rewound. Meaning the previous example would now result in:

nodeData: 1
nodeData: 2
nodeData: 3

SOAP

SoapClient::$typemap is now an array rather than a resource. Checks using is_resource() (i.e. is_resource($client->typemap)) should be replaced with checks for null (i.e. $client->typemap !== null).

The SOAP extension gained an optional dependency on the session extension. If PHP is built without the session extension and with the --enable-rtld-now configure flag enabled, startup errors will now occur if the SOAP extension is also used. To solve this either don't use rtld-now or load the session extension.

Standard

When using strcspn() with characters being the empty string, the length of the string is now returned instead of incorrectly stopping at the first null byte.

http_build_query() now correctly handles backed enums.

stream_bucket_make_writeable() and stream_bucket_new() will now return a StreamBucket instance instead of an instance of stdClass.

Tidy

Failures in the constructor now throw exceptions rather than emitting warnings and having a broken object.

XML

The xml_set_*_handler functions now declare and check for an effective signature of callable|string|null for the handler parameters. Moreover, values of type string that correspond to method names, of object set with xml_set_object() are now checked to see if the method exists on the class of the previously passed object. This means that xml_set_object() must now always be called prior to setting method names as callables. Passing an empty string to disable the handler is still allowed, but deprecated.

However, as xml_set_object() and passing non-callable strings is deprecated. It is recommended to change such instances with a callable referring to the method directly.

PHP 8.3 → 8.4: Устаревшие возможности

Устаревание — раннее предупреждение, а не немедленное удаление. На тестовом контуре включают E_ALL, собирают deprecation без подавления, выбирают замену и исправляют собственный код до следующей мажорной версии.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Ядро PHP

Неявно обнуляемые параметры

Тип параметра неявно расширяется типом null, если значение по умолчанию для параметра равно null.

Следующий код:

<?php

function foo(T1 $a = null) {}

?>
потребуется преобразовать вот так:
<?php

function foo(T1|null $a = null) {}

?>
или так:
<?php

function foo(?T1 $a = null) {}

?>

Однако, если за объявлением параметра со значением null по умолчанию идёт обязательный параметр:

<?php

function foo(T1 $a, T2 $b = null, T3 $c) {}

?>
код потребуется преобразовать вот так:
<?php

function foo(T1 $a, T2|null $b, T3 $c) {}

?>
или так:
<?php

function foo(T1 $a, ?T2 $b, T3 $c) {}

?>
поскольку объявление необязательного параметра перед обязательным устарело.

Возведение нуля в отрицательную степень

Возведение числа в отрицательную степень эквивалентно взятию обратной величины числа, возведённого в положительную степень, противоположную отрицательной. Например: 10-2 — то же, что 1 / 102. Поэтому возведение числа 0 в отрицательную степень соответствует делению на 0: 0-2 — то же, что 1 / 02, или 1 / 0. Поэтому такое поведение устарело.

Изменение касается поведения оператора возведения в степень ** и функции pow().

Следовать семантике стандарта IEEE 754 помогает новая функция fpow().

Подчёркивание _ как название класса

Именование класса символом _ устарело:

<?php

class _ {}

?>

Замечание:

Имена классов, которые начинаются с подчёркивания, не устарели:

<?php

class _MyClass {}

?>

Вызов функции trigger_error() с флагом E_USER_ERROR

Вызов функции trigger_error() с аргументом error_level, который равен значению константы E_USER_ERROR, устарел.

Такие вызовы потребуется заменить выбрасыванием исключения или вызовом языковой конструкции exit(), смотря что уместнее.

Константа E_STRICT

Поскольку уровень ошибки E_STRICT удалили, константа устарела.

Модуль cURL

Константа CURLOPT_BINARYTRANSFER устарела.

Модуль Date

Сигнатура метода DatePeriod::__construct(string $isostr, int $options = 0) устарела. Вместо устаревшего метода рекомендуют пользоваться методом DatePeriod::createFromISO8601String().

Константы SUNFUNCS_RET_TIMESTAMP, SUNFUNCS_RET_STRING и SUNFUNCS_RET_DOUBLE устарели. Константы устарели вследствие устаревания функций date_sunset() и date_sunrise() в PHP 8.1.0.

Модуль DBA

Передача значения null или false в функцию dba_key_split() устарела. При передаче таких значений функция вернёт false.

Модуль DOM

Константа DOM_PHP_ERR устарела.

Следующие свойства официально устарели:

Модуль Hash

Передача недопустимых параметров в хеш-функции устарела.

Модуль Intl

Вызов функции intlcal_set() и метода IntlCalendar::set() с более чем двумя аргументами устарел. Вместо них рекомендуют пользоваться методом IntlCalendar::setDate() или IntlCalendar::setDateTime().

Вызов функции intlgregcal_create_instance() и метода IntlGregorianCalendar::__construct() с более чем двумя аргументами устарел. Вместо них рекомендуют пользоваться методом IntlGregorianCalendar::createFromDate() или IntlGregorianCalendar::createFromDateTime().

Модуль LDAP

Вызов функции ldap_connect() с более чем двумя аргументами устарел. Вместо неё рекомендуют пользоваться функцией ldap_connect_wallet().

Вызов функции ldap_exop() с более чем четырьмя аргументами устарел. Вместо неё рекомендуют пользоваться функцией ldap_exop_sync().

Модуль MySQLi

Функция mysqli_ping() и метод mysqli::ping() устарели, поскольку функцию переподключения удалили в PHP 8.2.0.

Функция mysqli_kill() и метод mysqli::kill() устарели. Завершать запущенный запрос помогает SQL-команда KILL.

Функция mysqli_refresh() и метод mysqli::refresh() устарели. Очищать кеш БД помогает SQL-команда FLUSH. Константы семейства MYSQLI_REFRESH_* тоже устарели.

Явная передача параметра mode в функцию mysqli_store_result() устарела. Константа MYSQLI_STORE_RESULT_COPY_DATA тоже устарела, поскольку работала только вместе с функцией.

Драйвер PDO_PGSQL

Экранирование знаков вопроса ?? внутри строк, обёрнутых знаками доллара, устарело. Требование экранировать знаки вопроса внутри строк отменили, поскольку драйвер PDO_PGSQL теперь содержит внутренний SQL-парсер с поддержкой оборачивания строк знаками доллара.

Драйвер PGSQL

Сигнатуры функций pg_fetch_result(), pg_field_prtlen() и pg_field_is_null() с двумя параметрами устарели. Вместо сигнатуры с двумя параметрами рекомендуют использовать сигнатуру с тремя параметрами со значением null для параметра row.

Модуль Random

Функция lcg_value() устарела, поскольку часто работала неправильно. Вместо неё рекомендуют использовать метод Random\Randomizer::getFloat().

Модуль Reflection

Вызов метода ReflectionMethod::__construct() с одним аргументом устарел. Вместо него рекомендуют использовать метод ReflectionMethod::createFromMethodName().

Модуль Session

Вызов функции session_set_save_handler() с более чем двумя аргументами устарел. Вместо неё рекомендуют использовать сигнатуру с двумя аргументами.

Изменение значения директив session.sid_length и session.sid_bits_per_character в INI-настройках устарело. Вместо изменения значений директив рекомендуют обновить бэкенд хранилища сессий, чтобы он принимал 32-символьные шестнадцатеричные идентификаторы сессий, и прекратить изменение этих INI-параметров.

Изменение значения директив session.use_only_cookies, session.use_trans_sid, session.trans_sid_tags, session.trans_sid_hosts и session.referer_check в INI-настройках устарело. Константа SID тоже устарела.

Модуль SOAP

Передача int-значений в аргументах метода SoapServer::addFunction() устарела. Для получения списка, который содержит название каждой PHP-функции, Элементы массива, который возвращает функция get_defined_functions(), сводят к одному уровню, когда требуется экспортировать список всех PHP-функций.

Константа SOAP_FUNCTIONS_ALL устарела.

Модуль SPL

Метод SplFixedArray::__wakeup() устарел, поскольку реализует методы SplFixedArray::__serialize() и SplFixedArray::__unserialize(), которыми рекомендуют заменить устаревший метод.

Значение по умолчанию для параметра escape в методах SplFileObject::setCsvControl(), SplFileObject::fputcsv()SplFileObject::fgetcsv() устарело. Значение по умолчанию рекомендуют передавать явно либо позиционно, либо через именованные аргументы. Это не касается методов SplFileObject::fputcsv() и SplFileObject::fgetcsv(), если новое значение по умолчанию установили методом SplFileObject::setCsvControl().

Стандартные функции

Сигнатура функции stream_context_set_option() с двумя аргументами устарела. Вместо неё рекомендуют пользоваться сигнатурой функции stream_context_set_options() с четырьмя аргументами.

Десериализация строк с тегом S в верхнем регистре функцией unserialize() устарела.

Значение по умолчанию для параметра escape в функциях fputcsv(), fgetcsv() и str_getcsv() устарело. Значение по умолчанию рекомендуют передавать явно либо позиционно, либо через именованные аргументы.

Модуль XML

Функция xml_set_object() устарела.

Передача в функцию xml_set_* строк, которые не принадлежат типу callable, устарела.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP Core

Implicitly nullable parameter

A parameter's type is implicitly widened to accept null if the default value for it is null.

The following code:

<?php
function foo(T1 $a = null) {}
should be converted to:
<?php
function foo(T1|null $a = null) {}
or
<?php
function foo(?T1 $a = null) {}

However, if such a parameter declaration is followed by a mandatory parameter:

<?php
function foo(T1 $a, T2 $b = null, T3 $c) {}
It must be converted to:
<?php
function foo(T1 $a, T2|null $b, T3 $c) {}
or
<?php
function foo(T1 $a, ?T2 $b, T3 $c) {}
as optional parameter before required ones are deprecated.

Raising zero to the power of negative number

Raising a number to the power of a negative number is equivalent to taking the reciprocal of the number raised to the positive opposite of the power. That is, 10-2 is the same as 1 / 102. Therefore raising 0 to the power of a negative number corresponds to dividing by 0, i.e. 0-2 is the same as 1 / 02, or 1 / 0. Thus, this behavior has been deprecated.

This affects the exponentiation operator ** and the pow() function.

If the IEEE 754 semantics are desired one should use the new fpow() function.

Using underscore _ as class name

Naming a class _ is now deprecated:

<?php
class _ {}

Note:

Classes whose names start with an underscore are not deprecated:

<?php
class _MyClass {}

Using trigger_error() with E_USER_ERROR

Calling trigger_error() with error_level being equal to E_USER_ERROR is now deprecated.

Such usages should be replaced by either throwing an exception, or calling exit(), whichever is more appropriate.

The E_STRICT constant

Because the E_STRICT error level was removed, this constant is now deprecated.

cURL

The CURLOPT_BINARYTRANSFER constant is now deprecated.

Date

The DatePeriod::__construct(string $isostr, int $options = 0) signature has been deprecated. Use DatePeriod::createFromISO8601String() instead.

The SUNFUNCS_RET_TIMESTAMP, SUNFUNCS_RET_STRING, and SUNFUNCS_RET_DOUBLE constants are now deprecated. This follows from the deprecation of the date_sunset() and date_sunrise() functions in PHP 8.1.0.

DBA

Passing null or false to dba_key_split() is now deprecated. It would always return false in those cases.

DOM

The DOM_PHP_ERR constant is now deprecated.

The following properties have been formally deprecated:

Hash

Passing invalid options to hash functions is now deprecated.

Intl

Calling intlcal_set() or IntlCalendar::set() with more than two arguments is deprecated. Use either IntlCalendar::setDate() or IntlCalendar::setDateTime() instead.

Calling intlgregcal_create_instance() or IntlGregorianCalendar::__construct() with more than two arguments is deprecated. Use either IntlGregorianCalendar::createFromDate() or IntlGregorianCalendar::createFromDateTime() instead.

LDAP

Calling ldap_connect() with more than two arguments is deprecated. Use ldap_connect_wallet() instead.

Calling ldap_exop() with more than four arguments is deprecated. Use ldap_exop_sync() instead.

MySQLi

The mysqli_ping() function and mysqli::ping() method are now deprecated as the reconnect feature was removed in PHP 8.2.0.

The mysqli_kill() function and mysqli::kill() method are now deprecated. If this functionality is needed a SQL KILL command can be used instead.

The mysqli_refresh() function and mysqli::refresh() method are now deprecated. If this functionality is needed a SQL FLUSH command can be used instead. All MYSQLI_REFRESH_* constants have been deprecated as well.

Passing the mode parameter to mysqli_store_result() explicitly has been deprecated. As the MYSQLI_STORE_RESULT_COPY_DATA constant was only used in conjunction with this function it has also been deprecated.

PDO_PGSQL

Using escaped question marks (??) inside dollar-quoted strings is deprecated. Because PDO_PGSQL now has its own SQL parser with dollar-quoted strings support, it is no longer necessary to escape question marks inside them.

PGSQL

The 2 arguments signature of pg_fetch_result(), pg_field_prtlen(), and pg_field_is_null() is now deprecated. Use the 3 arguments signature with row set to null instead.

Random

lcg_value() is now deprecated, as the function is broken in multiple ways. Use Random\Randomizer::getFloat() instead.

Reflection

Calling ReflectionMethod::__construct() with one argument is deprecated. Use ReflectionMethod::createFromMethodName() instead.

Session

Calling session_set_save_handler() with more than two arguments is deprecated. Use the two arguments signature instead.

Changing the value of the session.sid_length and session.sid_bits_per_character INI settings is deprecated. Update the session storage backend to accept 32 character hexadecimal session IDs and stop changing these two INI settings instead.

Changing the value of the session.use_only_cookies, session.use_trans_sid, session.trans_sid_tags, session.trans_sid_hosts, and session.referer_check INI settings is deprecated. The SID constant is also deprecated.

SOAP

Passing an int to SoapServer::addFunction() is now deprecated. If all PHP functions need to be provided flatten the array returned by get_defined_functions().

The SOAP_FUNCTIONS_ALL constant is now deprecated.

SPL

The SplFixedArray::__wakeup() method is now deprecated, as it implements SplFixedArray::__serialize() and SplFixedArray::__unserialize() which need to be overwritten instead.

Using the default value for the escape parameter for the SplFileObject::setCsvControl(), SplFileObject::fputcsv(), and SplFileObject::fgetcsv() is now deprecated. It must be passed explicitly either positionally or via named arguments. This does not apply to SplFileObject::fputcsv() and SplFileObject::fgetcsv() if SplFileObject::setCsvControl() was used to set a new default value.

Standard

Calling stream_context_set_option() with two arguments is deprecated. Use stream_context_set_options() instead.

Unserializing strings using the uppercase S tag with unserialize() is deprecated.

Using the default value for the escape parameter for the fputcsv(), fgetcsv(), and str_getcsv() is now deprecated. It must be passed explicitly either positionally or via named arguments.

XML

The xml_set_object() function has been deprecated.

Passing non-callable strings to the xml_set_* functions is now deprecated.

PHP 8.3 → 8.4: Удалённые расширения

Удаление расширения — зависимость уровня архитектуры. Нужно найти все вызовы, формат сохранённых данных и операционные процедуры, выбрать замену и провести миграцию до смены runtime.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Следующие модули перенесли в репозиторий PECL и исключили из PHP-дистрибутива. Новые выпуски PECL-пакетов будут публиковать на основе запросов пользователей.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

These extensions have been moved to PECL and are no longer part of the PHP distribution. New releases for the PECL packages will be published on an ad-hoc basis according to user demand.

PHP 8.3 → 8.4: Другие изменения

Сюда попадают изменения поведения, конфигурации и расширений, которые не образуют новую синтаксическую конструкцию. Их сверяют с фактически установленными модулями и рабочими сценариями проекта.

Полный официальный договор страницы — большой справочник, раскрывается по запросу

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Изменения в ядре

Замыкания

Названия замыканий изменили так, чтобы имена включали название родительской функции и строку, в которой определили замыкание, что помогает различать замыкания в трассировках стека или другом месте вывода отладочной информации.

Файберы

Переключение файберов теперь разрешили при запуске деструктора. Раньше переключение файберов блокировали из-за конфликтов со сборщиком мусора.

Деструкторы теперь разрешается выполнять в отдельном файбере:

Когда в файбере запускается сборка мусора, деструкторы, которые вызвал сборщик мусора, выполняются в отдельном файбере: gc_destructor_fiber. Для выполнения оставшихся деструкторов создаётся новый файбер, если этот файбер приостанавливается. Сборщик мусора больше не ссылается на предыдущий файбер gc_destructor_fiber, поэтому файбер доступен для сборки, раз ссылок на него не осталось. Сборщик мусора не соберёт объекты, деструктор которых приостановился, до тех пор, пока деструктор не вернется или пока сборщик мусора не уничтожит файбер.

Обработчики вывода

Флаги статуса обработчика вывода, которые передали в параметр flags функции ob_start(), теперь очищаются.

Функция output_add_rewrite_var() для выбора хостов, которые перезапишутся, теперь руководствуется значением директивы url_rewriter.hosts вместо директивы session.trans_sid_hosts.

Изменения в SAPI-модулях

apache2handler

Из-за окончания жизненного цикла удалили поддержку веб-серверов Apache 2.0 и 2.2. Теперь требуется версия Apache не ниже 2.4.

Модуль CLI

Встроенный сервер ищет индексный файл рекурсивно путём обхода родительских каталогов, когда не находит файл. Раньше этот процесс пропускался, если путь выглядел так, как будто ссылается на файл, т. е. если последний компонент пути содержал точку. Тогда возвращалась ошибка 404. Поведение изменили для поиска индексного файла во всех случаях.

Модуль FPM

Теперь сброс, или отправка, заголовков без тела выполнится успешно.

На странице статуса появилось новое поле, которое показывает пиковое значение объёма выделяемой памяти.

Настройку events.mechanism в файле /dev/poll для ОС Solaris/Illumos удалили.

Изменённые функции

Ядро

Функции trigger_error() и user_error() теперь возвращают конкретное логическое значение true вместо общего bool.

Модуль DOM

В Методе DOMDocument::registerNodeClass() предварительный тип возврата определили как true вместо прежнего bool, поскольку на практике метод возвращал только true.

Модуль Hash

В функции hash_update() предварительный тип возврата теперь true вместо прежнего bool, поскольку на практике метод возвращал только true.

Модуль Intl

Константы NumberFormatter::ROUND_TOWARD_ZERO и NumberFormatter::ROUND_AWAY_FROM_ZERO добавили как синонимы констант NumberFormatter::ROUND_DOWN и NumberFormatter::ROUND_UP для согласованности с семейством режимов PHP_ROUND_*.

Метод ResourceBundle::get() получил предварительный тип возврата ResourceBundle|array|string|int|null.

Функции idn_to_ascii() и idn_to_utf8() теперь выбрасывают ошибки ValueError при каждом вызове, если имя в параметре domain оказалось пустым или слишком длинным.

Функции idn_to_ascii() и idn_to_utf8() теперь выбрасывают ошибку ValueError при каждом вызове, если значение аргумента variant не равно INTL_IDNA_VARIANT_UTS46.

Модуль LibXML

Функция libxml_set_streams_context() теперь сразу выбрасывает ошибку TypeError, когда в функцию передают ресурс, который не относится к контексту потока, вместо того, чтобы выбрасывать ошибку позже, когда появляется потоковый контекст.

Модуль MBString

Поведение функции mb_strcut() теперь лучше согласуется с недопустимыми для кодировок UTF-8 и UTF-16 строками. Для допустимых для кодировок UTF-8 и UTF-16 строк поведение не изменилось.

Модуль ODBC

Разработчики изменили значение по умолчанию для параметра row в функциях odbc_fetch_object(), odbc_fetch_array() и odbc_fetch_into(), теперь значение равно null, что согласуется в функцией odbc_fetch_row(). Предыдущие значения по умолчанию равнялись -1, -1 и 0 соответственно.

Модуль OpenSSL

Параметр extra_attributes в функции openssl_csr_new() вместо DN-имени (англ. сокр.: Distinguished Name — уникальное имя) субъекта устанавливает атрибут CSR; раньше функция делала это неправильно.

Параметр dn в функции openssl_csr_new() разрешает устанавливать массив (array) значений для одной записи.

В функцию openssl_csr_sign() добавили новый параметр serial_hex, который разрешает устанавливать серийные номера в шестнадцатеричном формате.

Разбор значений даты и времени в формате UTCTime языка ASN.1 функцией openssl_x509_parse() завершится ошибкой, если секунды опустили для версии модуля OpenSSL ниже 3.2 (для таких полей возвращает значение -1). Версия OpenSSL выше 3.3 уже не загружала такие сертификаты.

Модуль PDO

Получить значение атрибута PDO::ATTR_STRINGIFY_FETCHES теперь возможно методом PDO::getAttribute().

Добавили новую константу PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE, чтобы получать данные о потреблении памяти результатами запросов методом PDO::getAttribute() для драйверов, которые поддерживают метод.

Драйвер PDO_FIREBIRD

Значения атрибутов FB_ATTR_DATE_FORMAT, FB_ATTR_TIME_FORMAT и FB_ATTR_TIMESTAMP_FORMAT теперь возможно получать методом PDO::getAttribute().

Добавили новые атрибуты, которые указывают уровень изоляции транзакции и режим доступа. Добавили пять констант, которые относятся к этой функциональности:

Конструкторе теперь проверяет работоспособность подключений при работе с постоянными соединениями.

Содержимое, которое создаёт драйвер, меняется в зависимости от значения флага FB_API_VER в файле ibase.h. Эту информацию получают методом Pdo\Firebird::getApiVersion(). Эта информация теперь также упоминается в выводе функции phpinfo().

Теперь доступны пять новых типов данных: INT128, DEC16, DEC34, TIMESTAMP_TZ, TIME_TZ . Типы доступны начиная с Firebird 4.0.

Драйвер PDO_MYSQL

Значение атрибута PDO::ATTR_FETCH_TABLE_NAMES теперь возможно получать методом PDO::getAttribute().

Драйвер PDO_PGSQL

Добавили поддержку получения информации о потреблении памяти запросами для флага PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE.

Значение тперь возвращается как число с плавающей точкой float, а не как строка (string), если столбец принадлежит типу FLOAT4OID или FLOAT8OID.

Модуль PGSQL

Параметр conditions функции pg_select() теперь необязателен и принимает пустой массив.

Модуль Phar

В методах Phar::setAlias(), Phar::setDefaultStub() предварительный тип возврата bool изменили на true.

Модуль POSIX

Функция posix_isatty() теперь устанавливает номер ошибки, если аргумент дескриптора файла или потока недопустим.

Модуль Reflection

Метод ReflectionGenerator::getFunction() теперь разрешили вызывать, когда завершится выполнение генератора.

Модуль Sockets

Значение по умолчанию для параметра backlog функции socket_create_listen() изменили на SOMAXCONN. Раньше значение по умолчанию равнялось 128.

Модуль Sodium

Функции семейства sodium_crypto_aead_aes256gcm_* теперь доступны для центральных процессоров, которые построили по архитектуре aarch64, с криптографическими модулями ARM.

Стандартная PHP-библиотека SPL

Предварительный тип возврата в методах SplPriorityQueue::insert(), SplPriorityQueue::recoverFromCorruption(), SplHeap::insert(), SplHeap::recoverFromCorruption() изменили с bool на true.

Класс SplObjectStorage теперь реализует итератор SeekableIterator.

Стандартные функции

Значение по умолчанию стоимости 'cost' для алгоритма хеширования PASSWORD_BCRYPT в функции password_hash() увеличили с 10 до 12.

Функция debug_zval_dump() теперь указывает, упакован ли массив.

Тип возврата в функции long2ip() изменили со string|false на string.

Тип возврата в функции highlight_string() изменили со string|bool на string|true.

Тип возврата в функции print_r() изменили со string|bool на string|true.

Округление чисел функцией round()

Тип параметра mode функции round() расширили до типа RoundingMode|int, который теперь принимает новое перечисление RoundingMode.

В функцию round() добавили четыре новых режима: RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero

Внутреннюю реализацию округления до целых чисел переписали, чтобы реализацию было легче проверять на корректность и поддерживать. По ходу переписывания исправили ряд ошибок округления. Например, раньше округление числа 0.49999999999999994 до ближайшего целого вернуло бы значение 1.0 вместо правильного результата — 0.0. Округление также затронет часть дополнительных входных данных и выдаст другой по сравнению с предыдущими версиями PHP результат.

Исправили ошибку, которую вызывало «предварительное округление» в функции round(). Раньше для обработки как десятичного числа, значения наподобие 0.285, которое PHP внутренне представляет как 0.28499999999999998, функция вначале «предварительно округляла» число, а затем округляла результат до 0.29. Однако «предварительное округление» неправильно округляет отдельные числа, поэтому это исправление удаляет «предварительное округление» и изменяет способ сравнения чисел, чтобы значения правильно округлялись как десятичные числа, а не как числа с плавающей точкой по стандарту IEEE754.

Максимальную точность, с которой функция round() умеет обрабатывать числа, увеличили на один знак. Например, вызов round(4503599627370495.5) возвращал число 4503599627370495.5, а теперь возвращает 4503599627370496.

Другие изменения в модулях

Модуль cURL

Минимальная версия библиотеки libcurl, которая требуется для работы модуля, теперь 7.61.0.

Опция CURLOPT_DNS_USE_GLOBAL_CACHE больше ни на что не влияет, и без предупреждения игнорируется. Опция устарела на нижележащем уровне — в библиотеке libcurl 7.11.1, а в libcurl 7.62.0 опцию удалили.

Модуль GMP

GMP-объекты разрешили приводить к логическому типу bool, раньше выдавалась ошибка уровня E_RECOVERABLE_ERROR. Поведение приведения перегружается так, чтобы GMP-объект, который представляет значение 0, приводился к логическому значению false.

Модуль LibXML

Минимальная версия библиотеки libxml2, которая требуется для работы модуля, теперь 2.9.4.

Модуль Intl

Поведение класса Intl нормализовали так, чтобы при попытке использовать неинициализированный объект или при ошибках клонирования класс выбрасывал ошибку Error.

Модуль MBString

Таблицы данных Юникода обновили до Unicode 16.0.

Драйвер MySQLnd

Добавили поддержку нового типа данных БД MySQL 9 — VECTOR.

Модуль OpenSSL

Минимальная версия библиотеки OpenSSL, которая требуется для работы модуля, теперь 1.1.1.

Драйвер PDO_PGSQL

Минимальная версия библиотеки libpq, которая требуется для работы драйвера, теперь 10.0.

Модуль PGSQL

Минимальная версия библиотеки libpq, которая требуется для работы модуля, теперь 10.0.

Стандартная PHP-библиотека SPL

Доступ за пределы массива в SplFixedArray теперь вместо RuntimeException выбрасывает исключение OutOfBoundsException. Поскольку OutOfBoundsException — дочерний класс RuntimeException, поведение при попытке перехватить эти исключения не меняется.

Модуль XSL

Объявили типизированные свойства XSLTProcessor::$cloneDocument и XSLTProcessor::$doXInclude.

Модуль Zlib

Минимальная версия библиотеки zlib, которая требуется для работы модуля, теперь 1.2.11.

Производительность

Ядро

Улучшили производительность разбора и форматирования чисел с плавающей точкой в ZTS-сборках при высокой параллельной нагрузке. Это влияет на семейство функций printf(), и на функции сериализации наподобие json_encode() или serialize().

Вызов функции sprintf() только со спецификаторами %s и %d скомпилирует эквивалентную интерполяцию строки без накладных расходов на вызов функции и без повторного анализа строки формата.

Модуль BCMath

Улучили производительность числовых преобразований и операций.

Модуль DOM

Производительность метода DOMNode::C14N() значительно улучшили при вызове без xpath-выражения. Изменение иногда сокращает время запроса на два порядка при обработке документов с десятками тысяч узлов.

Улучшили производительность и снизили потребление памяти при XML-сериализации.

Снизили потребление памяти классами узлов.

Модуль FTP

Улучшили производительность загрузки больших файлов по протоколу FTP до 10 раз.

Модуль Hash

Добавили реализацию алгоритма SHA-256 инструкциями SSE2 и SHA-NI. Изменение повышает производительность поддерживаемых процессоров примерно в 1,3 раза для SSE2-инструкций и до 3-5 раз для инструкций SHA-NI. Благодарим Колина Персиваля (англ. Colin Percival), разработчика сервиса резервного копирования Tarsnap, за эту оптимизацию.

Модуль MBString

Функция mb_strcut() теперь быстрее обрабатывает строки в кодировках UTF-8 и UTF-16.

Поиск названий кодировок многобайтовых строк теперь выполняется намного быстрее.

Значительно улучшили производительность преобразования строк в кодировке SJIS-win в кодировку Unicode.

Драйвер MySQLnd

Улучшили производительность при обработке драйвером MySQLnd значений в кавычках в MySQL-запросах.

Модуль PCRE

Улучшили производительность именованных групп захвата.

Модуль Random

Улучшили производительность класса Random\Randomizer, повышенное внимание уделили методам Random\Randomizer::getBytes() и Random\Randomizer::getBytesFromString().

Модуль SimpleXML

Улучшили производительность и снизили потребление памяти при XML-сериализации.

Стандартные функции

Значительно улучшили производительность функций strspn() и strcspn(). Теперь функции работают за линейное время, а не ограничиваются квадратичным временем.

Улучшили производительность функции strpbrk().

Функция get_browser() теперь работает до 1,5-2,5 раза быстрее в отдельных тестах.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Core changes

Closures

Closure names have been adjusted to include the parent function's name and the line of definition to make them easier to distinguish, for example within stack traces.

Fibers

Fiber switching during destructor execution is now allowed. It was previously blocked due to conflicts with garbage collection.

Destructors may now be executed in a separate Fiber:

When garbage collection is triggered in a Fiber, destructors called by the GC are executed in a separate Fiber: the gc_destructor_fiber. If this Fiber suspends, a new one is created to execute the remaining destructors. The previous gc_destructor_fiber is not referenced anymore by the GC and may be collected if it's not referenced anywhere else. Objects whose destructor is suspended will not be collected until the destructor returns or the Fiber is collected.

Output Handlers

Output handler status flags passed to the flags parameter of ob_start() are now cleared.

output_add_rewrite_var() now uses url_rewriter.hosts instead of session.trans_sid_hosts for selecting hosts that will be rewritten.

Changes in SAPI Modules

apache2handler

Support for EOL Apache 2.0 and 2.2 has been removed. Minimum required Apache version is now 2.4.

CLI

The builtin server looks for an index file recursively by traversing parent directories in case the specified file cannot be located. This process was previously skipped if the path looked like it was referring to a file, i.e. if the last path component contained a period. In that case, a 404 error was returned. The behavior has been changed to look for an index file in all cases.

FPM

Flushing headers without a body will now succeed.

Status page has a new field to display a memory peak.

The /dev/pollevents.mechanism setting for Solaris/Illumos had been retired.

Changed Functions

Core

trigger_error() and user_error() now have a return type of true instead of bool.

DOM

DOMDocument::registerNodeClass() now has a tentative return type of true instead of bool. It could only ever return true in practice.

Hash

hash_update() now has a tentative return type of true instead of bool. It could only ever return true in practice.

Intl

NumberFormatter::ROUND_TOWARD_ZERO and NumberFormatter::ROUND_AWAY_FROM_ZERO have been added as aliases for NumberFormatter::ROUND_DOWN and NumberFormatter::ROUND_UP to be consistent with the new PHP_ROUND_* modes.

ResourceBundle::get() now has a tentative return type of ResourceBundle|array|string|int|null.

The idn_to_ascii() and idn_to_utf8() functions now always throw ValueErrors if the domain name is empty or too long.

The idn_to_ascii() and idn_to_utf8() functions now always throw ValueError if the variant parameter is not INTL_IDNA_VARIANT_UTS46.

LibXML

libxml_set_streams_context() now immediately throws a TypeError when a non-stream-context resource is passed to the function, instead of throwing later when the stream context is used.

MBString

The behavior of mb_strcut() is more consistent now on invalid UTF-8 and UTF-16 strings. There is no behavioural change for valid UTF-8 and UTF-16 strings.

ODBC

The row of odbc_fetch_object(), odbc_fetch_array(), and odbc_fetch_into() now have a default value of null, consistent with odbc_fetch_row(). Previously, the default values were -1, -1, and 0, respectively.

OpenSSL

The extra_attributes in openssl_csr_new() sets the CSR attributes instead of subject DN, which incorrectly done previously.

The dn in openssl_csr_new() allows setting an array of values for a single entry.

New serial_hex added to openssl_csr_sign() to allow setting serial numbers in the hexadecimal format.

Parsing ASN.1 UTCTime with openssl_x509_parse() fails if seconds are omitted for OpenSSL version below 3.2 (-1 is returned for such fields). OpenSSL version above 3.3 did not load such certificates already.

PDO

It is now possible to fetch the value of the PDO::ATTR_STRINGIFY_FETCHES attribute with PDO::getAttribute().

A new Pdo\Pgsql::ATTR_RESULT_MEMORY_SIZE has been added to retrieve the memory usage of query results with PDO::getAttribute() for drivers that support it.

PDO_FIREBIRD

It is now possible to fetch the value of the FB_ATTR_DATE_FORMAT, FB_ATTR_TIME_FORMAT, FB_ATTR_TIMESTAMP_FORMAT, attributes with PDO::getAttribute().

Added new attributes to specify transaction isolation level and access mode. Five constants relating to this functionality have been added:

When using persistent connections, there is now a liveliness check in the constructor.

The content that is built changes depending on the value of FB_API_VER in ibase.h. A new static method Pdo\Firebird::getApiVersion() can be used to obtain this information. This information is also now referenced in phpinfo().

Five new data types are now available: INT128, DEC16, DEC34, TIMESTAMP_TZ, TIME_TZ . These are available starting with Firebird 4.0.

PDO_MYSQL

It is now possible to fetch the value of the PDO::ATTR_FETCH_TABLE_NAMES attribute with PDO::getAttribute().

PDO_PGSQL

Support retrieving the memory usage of queries for Pdo\Pgsql::ATTR_RESULT_MEMORY_SIZE.

If the column is of type FLOAT4OID or FLOAT8OID the value will now be returned as a float instead of a string.

PGSQL

The conditions parameter of pg_select() is now optional and accepts an empty array.

Phar

The Phar::setAlias(), Phar::setDefaultStub() methods now have a tentative return type of true instead of bool.

POSIX

posix_isatty() now sets the error number when the file descriptor/stream argument is invalid.

Reflection

ReflectionGenerator::getFunction() may now be called after the generator finished executing.

Sockets

The backlog parameter of socket_create_listen() now has a default value of SOMAXCONN. Previously, it was 128.

Sodium

The sodium_crypto_aead_aes256gcm_* functions are now available on aarch64 CPUs with the ARM cryptographic extensions.

Standard

The default 'cost' value for the PASSWORD_BCRYPT hashing algorithm for password_hash() has been increased from 10 to 12.

debug_zval_dump() now indicates whether an array is packed.

long2ip() now has a return type of string instead of string|false.

highlight_string() now has a return type of string|true instead of string|bool.

print_r() now has a return type of string|true instead of string|bool.

Rounding with round()

The mode parameter of the round() function has been widened to RoundingMode|int, accepting instances of a new RoundingMode enum.

Four new modes have been added to the round() function: RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero

The internal implementation for rounding to integers has been rewritten to be easier to verify for correctness and to be easier to maintain. Some rounding bugs have been fixed as a result of the rewrite. For example previously rounding 0.49999999999999994 to the nearest integer would have resulted in 1.0 instead of the correct result 0.0. Additional inputs might also be affected and result in different outputs compared to earlier PHP versions.

Fixed a bug caused by "pre-rounding" of the round() function. Previously, using "pre-rounding" to treat a value like 0.285 (actually 0.28499999999999998) as a decimal number and round it to 0.29. However, "pre-rounding" incorrectly rounds certain numbers, so this fix removes "pre-rounding" and changes the way numbers are compared, so that the values are correctly rounded as decimal numbers.

The maximum precision that can be handled by round() has been extended by one digit. For example, round(4503599627370495.5) returned in 4503599627370495.5, but now returns 4503599627370496.

Other Changes to Extensions

cURL

The minimum libcurl version required is now 7.61.0.

The CURLOPT_DNS_USE_GLOBAL_CACHE option no longer has any effect, and is silently ignored. This underlying feature was deprecated in libcurl 7.11.1, and removed in libcurl 7.62.0.

GMP

Casting a GMP object to bool is now possible instead of emitting a E_RECOVERABLE_ERROR. The casting behaviour is overloaded such that a GMP object representing the value 0 is cast to false.

LibXML

The minimum libxml2 version required is now 2.9.4.

Intl

Cloning an Intl object consistently throws an Error when the clone cannot be performed, either because the object has not been initialized, or because the underlying ICU clone operation failed. Formerly, most of these classes threw an Exception instead, and Spoofchecker raised a fatal error.

MBString

Unicode data tables have been updated to Unicode 16.0.

MySQLnd

Support for the new VECTOR data type from MySQL 9.

OpenSSL

The minimum OpenSSL version required is now 1.1.1.

PDO_PGSQL

The minimum libpq version required is now 10.0.

PGSQL

The minimum libpq version required is now 10.0.

SPL

Out of bounds accesses in SplFixedArray now throw exceptions of type OutOfBoundsException instead of RuntimeException. Because OutOfBoundsException is a child class of RuntimeException no behavioural changes are exhibited when attempting to catch those exceptions.

XSL

The typed properties XSLTProcessor::$cloneDocument and XSLTProcessor::$doXInclude are now declared.

Zlib

The minimum zlib version required is now 1.2.11.

Performance

Core

Improved the performance of floating point number parsing and formatting in ZTS builds under highly concurrent loads. This affects the printf() family of functions as well as serialization functions such as json_encode(), or serialize().

sprintf() using only %s and %d specifiers will be compiled into the equivalent string interpolation, avoiding the overhead of a function call and repeatedly parsing the format string.

BCMath

Improved performance of number conversions and operations.

DOM

The performance of DOMNode::C14N() is greatly improved for the case without an xpath query. This can give a time improvement of easily two order of magnitude for documents with tens of thousands of nodes.

Improved performance and reduce memory consumption of XML serialization.

Reduced memory usage of node classes.

FTP

Improved the performance of FTP uploads up to a factor of 10x for large uploads.

Hash

Added SSE2 and SHA-NI implementations of SHA-256. This improves the performance on supported CPUs by ~1.3x (SSE2), and 3x - 5x (SHA-NI). Credit to Colin Percival / Tarsnap for this optimization.

MBString

mb_strcut() is much faster now for UTF-8 and UTF-16 strings.

Looking up mbstring encoding names is much faster now.

The performance of converting SJIS-win to Unicode is greatly improved.

MySQLnd

Improved the performance of MySQLnd quoting.

PCRE

Improved the performance of named capture groups.

Random

Improved the performance of Random\Randomizer, with a specific focus on the Random\Randomizer::getBytes(), and Random\Randomizer::getBytesFromString() methods.

SimpleXML

Improved performance and reduce memory consumption of XML serialization.

Standard

The performance of strspn() and strcspn() is greatly improved. They now run in linear time instead of being bounded by quadratic time.

Improved the performance of strpbrk().

get_browser() is much faster now, up to 1.5x - 2.5x for some test cases.

PHP 8.3 → 8.4: Изменения поддержки Windows

Платформенные изменения проверяют в Windows-ветке CI: пути, кодировки, DLL, сигналы и сетевые детали нельзя надёжно подтвердить только Linux-тестом.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Ядро

Для сборки PHP компилятором среды Visual Studio теперь требуется интегрированная среда разработки как минимум версии Visual Studio 2019, но лучше работать с Visual Studio 2022.

Поддержка процессором расширения системных команд AVX(2) теперь правильно определяется для MSVC-сборок.

Встроенная сборка с поддержкой инструкций AVX-512 теперь поддерживается через параметр конфигурации --enable-native-intrinsics=avx512.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Core

Building with Visual Studio now requires at least Visual Studio 2019. However, Visual Studio 2022 is recommended.

AVX(2) CPU support is now properly detected for MSVC builds.

Native AVX-512 builds are now supported via the --enable-native-intrinsics=avx512 configure option.

PHP 8.4 → 8.5

Этот узел — контрольная карта перехода PHP 8.4 → 8.5. Начинают не с переписывания всего проекта, а с инвентаризации runtime, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.

Безопасный порядок обновления
  1. Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
  2. Прочитать несовместимости и deprecation именно для следующего шага.
  3. Поднять новую версию рядом, выполнить тесты и сравнить ответы.
  4. Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Миграция с PHP 8.4.x на PHP 8.5.x

Эта новая минорная версия приносит с ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.1.x, 7.2.x, 7.3.x, 7.4.x, 8.0.x, 8.1.x, 8.2.x. 8.3.x. 8.4.x.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Migrating from PHP 8.4.x to PHP 8.5.x

This new minor version brings with it a number of new features and a few incompatibilities that should be tested for before switching PHP versions in production environments.

See also the migration guides for PHP versions 7.1.x, 7.2.x, 7.3.x, 7.4.x, 8.0.x, 8.1.x, 8.2.x. 8.3.x. 8.4.x.

PHP 8.4 → 8.5: Новые возможности языка и платформы

Страница отвечает на вопрос «что нового можно применять после обновления». Новая запись не должна случайно попасть в код, который ещё запускается на старом runtime: минимальную версию фиксируют в Composer и проверяют в CI.

Новшества PHP 8.5 идут несколькими слоями. Синтаксис языка включает pipeline |>, callable в constant expressions, новые атрибуты и правила видимости. Далее идут независимые возможности расширений: cURL, DOM, Filter, Intl, PDO SQLite, Session, SOAP, изображения, URI, XSL и потоки. Версия PHP сама по себе не гарантирует нужную версию libcurl, ICU или libxml.

Как выбрать новшество без случайной несовместимости
  1. Найти нужный пункт и определить: язык, ядро или отдельное расширение.
  2. Проверить минимальную версию PHP и внешней библиотеки, если она указана.
  3. Прочитать параметры, результат и исключения конкретного API, затем воспроизвести минимальный случай.
  4. Зафиксировать ограничение Composer/CI до использования синтаксиса в общем коде.
Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Ядро PHP

Оператор Pipe

Добавили оператор конвейеризации |>.

<?php

$result = "Hello World" |> strlen(...);
print $result . PHP_EOL;  // Prints "11"

Замыкания в константных выражениях

Добавили поддержку статических замыканий в константных выражениях. Константные выражения теперь поддерживают как стандартный синтаксис объявления анонимных функций, так и синтаксис с многоточием, которым создаются первоклассные вызываемые объектыClosure. Статические замыкания определяют при инициализации:

  • Параметров атрибутов.
  • Значений по умолчанию для свойств и параметров.
  • Глобальных констант, констант в пространствах имён и констант классов.

Атрибут #[\NoDiscard]

Добавили атрибут NoDiscard, который делает значение возврата функции обязательным для обработки.

Добавили также инструкцию (void), которая указывает на намеренное игнорирование требования обработать значение возврата. Инструкция (void) не влияет на выполнение программы, а только подавляет предупреждения, которые выдаёт атрибут #[\NoDiscard], и возможные диагностические сообщения, которые выдают внешние IDE или инструменты статического анализа.

<?php

#[\NoDiscard]
function concat(string $a, string $b): string {
     return $a . $b;
}

// Предупреждение: Значение, которое возвращает функция concat(), требуется либо обработать,
// либо намеренно проигнорировать — указать инструкцию (void) перед вызовом функции в файле xxx.php.
concat("a", "b");

// Предупреждение не выдаётся, поскольку результат функции присваивается переменной.
$results = concat("a", "b");

// Предупреждение не выдаётся, поскольку инструкция (void) намеренно подавила вывод предупреждения.
(void)concat("a", "b");

Атрибуты констант

Добавили поддержку нацеливания атрибутов на константы, которые объявляются вне классов выражениями наподобие const MY_CONST = 1; и вычисляются на этапе компиляции. Константы, которые определили функцией — define('MY_CONST', 1);, не поддерживают назначение атрибутов.

Атрибут Deprecated теперь поддерживает нацеливание на константы.

Атрибут #[\DelayedTargetValidation]

Новый атрибут DelayedTargetValidation подавляет ошибки, которые на этапе компиляции выдаёт ядро или модуль при назначении атрибутов недопустимым целям. При назначении атрибута ядро или модуль сообщают об ошибках во время выполнения в момент вызова метода ReflectionAttribute::newInstance().

Атрибут #[\Override] для свойств

Атрибут Override теперь поддерживает нацеливание на свойства.

Асимметричная видимость статических свойств

Добавили поддержку асимметричной видимости при объявлении статических свойств.

Трассировки стека вызовов при фатальных ошибках

Фатальные ошибки наподобие превышения предельного времени выполнения теперь включают трассировку стека вызовов.

Объявление окончательных свойств в конструкторе

Конструкторы теперь поддерживают объявление окончательных свойств при продвижении параметров до свойств класса.

Приведения типов в константных выражениях

Добавили поддержку приведения типов в константных выражениях.

<?php

const T1 = (int) 0.3; // Раньше: "Fatal error: Constant expression contains invalid operations"
print T1 . PHP_EOL;   // Теперь выводит "0"

Функция clone

Языковая конструкция clone теперь стала функцией и поддерживает переназначение доступных только для чтения свойств во время клонирования через новый параметр $withProperties.

Модуль cURL

Добавили поддержку общих дескрипторов, которые сохраняются между PHP-запросами, разделяют ресурсы между сеансами обмена данными и сокращают накладные расходы на повторную установку соединений.

Для функции curl_getinfo() добавили поддержку констант CURLINFO_USED_PROXY (требуется библиотека libcurl >= 8.7.0), CURLINFO_HTTPAUTH_USED и CURLINFO_PROXYAUTH_USED (libcurl >= 8.12.0). При возврате функцией curl_getinfo() массива та же информация доступна в элементах с ключами "used_proxy", "httpauth_used" и "proxyauth_used". Константа CURLINFO_USED_PROXY получает значение ноль, если предыдущая передача выполнялась не через прокси, или ненулевое значение, если передача выполнялась через прокси. Константы CURLINFO_HTTPAUTH_USED и CURLINFO_PROXYAUTH_USED получают битовые маски, которые указывают на методы аутентификации HTTP и прокси в предыдущем запросе. Возможные значения содержатся в описании констант семейства CURLAUTH_*.

Добавили cURL-опцию CURLOPT_INFILESIZE_LARGE — безопасная замена константы CURLOPT_INFILESIZE. В отдельных системах опция CURLOPT_INFILESIZE для размера файла принимает только 32-разрядное знаковое целочисленное значение, которое ограничивает предельный размер файла 2,0 ГиБ, даже в 64-разрядных системах. Константа CURLOPT_INFILESIZE_LARGE принимает наибольшее целочисленное значение, обработку которого поддерживает система.

Добавили значения CURLFOLLOW_OBEYCODE, CURLFOLLOW_FIRSTONLY и CURLFOLLOW_ALL для опции CURLOPT_FOLLOWLOCATION функции curl_setopt(). Константа CURLFOLLOW_OBEYCODE для более строгого соблюдения перенаправлений, если они разрешены. Константа CURLFOLLOW_FIRSTONLY следует только за первым перенаправлением, поэтому передача прекратится, если в текущем сеансе обмена данными появятся очередные перенаправления. Константа CURLFOLLOW_ALL эквивалентна установке константе CURLOPT_FOLLOWLOCATION значения true.

Для функции curl_getinfo() добавили поддержку константы CURLINFO_CONN_ID (требуется библиотека libcurl >= 8.2.0). Константа возвращает уникальный идентификатор соединения, через которое модуль cURL выполнял передачу данных. В первую очередь константа полезна, когда в приложениях на уровне PHP требуется логика передачи данных через то же соединение или логика пула соединений. При возврате функцией curl_getinfo() массива значение доступно в элементе с ключом "conn_id".

Для функции curl_getinfo() добавили поддержку константы CURLINFO_QUEUE_TIME_T (требуется библиотека libcurl >= 8.6.0). Константа возвращает время в микросекундах, которое запрос провёл в очереди соединений библиотеки libcurl перед отправкой. Значение также доступно при передаче константы CURLINFO_QUEUE_TIME_T в параметр option функции curl_getinfo().

Добавили поддержку опции CURLOPT_SSL_SIGNATURE_ALGORITHMS, через которую указывают алгоритмы подписи для протокола TLS.

Модуль DOM

Добавили свойство Dom\Element::$outerHTML.

Добавили свойство $children в реализацию интерфейса Dom\ParentNode.

Модуль EXIF

Добавили поддержку Exif-тегов OffsetTime*.

Добавили поддержку формата HEIF/HEIC.

Фильтрация данных

Добавили новый флаг FILTER_THROW_ON_FAILURE для функций фильтрации. Флаг заставит функцию выбросить исключение, если значение не прошло фильтрацию. Новый флаг нельзя комбинировать с флагом FILTER_NULL_ON_FAILURE; при попытке объединить флаги PHP выбросит ошибку ValueError.

Модуль интернационализации

Добавили константы класса: NumberFormatter::CURRENCY_ISO, NumberFormatter::CURRENCY_PLURAL, NumberFormatter::CASH_CURRENCY и NumberFormatter::CURRENCY_STANDARD для форматов чисел, связанных с валютой.

Добавили методы Locale::addLikelySubtags() и Locale::minimizeSubtags() для обработки вероятных тегов заданной локали.

Добавили класс IntlListFormatter для форматирования, упорядочивания и пунктуации списка элементов с заданной локалью: операнды IntlListFormatter::TYPE_AND, IntlListFormatter::TYPE_OR, IntlListFormatter::TYPE_UNITS, а также ширины IntlListFormatter::WIDTH_WIDE, IntlListFormatter::WIDTH_SHORT, IntlListFormatter::WIDTH_NARROW. Поддерживается начиная с библиотеки ICU 67.

Драйвер PDO_Sqlite

В класс добавили константу Pdo\Sqlite::ATTR_BUSY_STATEMENT.

Добавили константы класса: Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT, Pdo\Sqlite::EXPLAIN_MODE_PREPARED, Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN, Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN_QUERY_PLAN.

Добавили атрибут соединения Pdo\Sqlite::ATTR_TRANSACTION_MODE с возможными значениями Pdo\Sqlite::TRANSACTION_MODE_DEFERRED, Pdo\Sqlite::TRANSACTION_MODE_IMMEDIATE и Pdo\Sqlite::TRANSACTION_MODE_EXCLUSIVE для настройки режима транзакции, в котором выполнится транзакция при вызове метода beginTransaction().

Сессии

Функции session_set_cookie_params(), session_get_cookie_params() и session_start() теперь поддерживают ключ "partitioned" для секционирования данных cookie.

Модуль SOAP

Варианты перечисления теперь выгружаются методом SoapClient::__getTypes().

Добавили поддержку атрибута xml:lang для элемента Reason Text в протоколе SOAP 1.2.

В сигнатуру методов SoapFault::__construct() и SoapServer::fault() добавили необязательный параметр lang. Параметр решает проблему совместимости с SOAP-клиентами на платформе .NET.

Стандартные модули

Функция mail() теперь возвращает фактическую ошибку процесса sendmail и распознаёт его внезапное завершение. В таких случаях PHP выдаёт предупреждение и функция возвращает false. Раньше эти ошибки игнорировались. Изменение затрагивает только транспорт sendmail.

Функция getimagesize() теперь поддерживает изображения в формате HEIF/HEIC.

Функция getimagesize() теперь поддерживает изображения в формате SVG, если установили библиотеку ext-libxml. Аналогично, функции image_type_to_extension() и image_type_to_mime_type() теперь тоже обрабатывают константу IMAGETYPE_SVG.

Массив, который возвращается функцией getimagesize(), теперь содержит две дополнительные записи: "width_unit" и "height_unit", которые указывают, в каких единицах выражаются размеры. По умолчанию размеры выражаются в пикселях — px. Не в каждом изображении единицы совпадают, например, размер одного направления выражается в сантиметрах — cm, а другого в пикселях — px.

Функции setcookie() и setrawcookie() теперь поддерживают ключ "partitioned".

Модуль URI

Добавили встроенный модуль URI, который теперь включён по умолчанию. Модуль предоставляет инструменты для обработки URI-идентификаторов и URL-адресов по правилам стандартов RFC 3986 и WHATWG.

Модуль XSL

Аргумент namespace в методах XSLTProcessor::getParameter(), XSLTProcessor::setParameter() и XSLTProcessor::removeParameter() теперь обрабатывается корректно и не игнорируется как пустой. Аргумент работает, только если параметр name указали не в нотации Кларка или QName-имени, поскольку при таком формате значения пространство имён извлекается из префикса или атрибута href самого имени.

Модуль Zlib

Функция flock() теперь поддерживает потоки zlib. Раньше попытки установить блокировку в таких потоках завершались ошибкой.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP Core

Pipe Operator

Added the pipe (|>) operator.

<?php
$result = "Hello World" |> strlen(...);
print $result . PHP_EOL;  // Prints "11"

Closure in constant expressions

Added support for Closures and first class callables in constant expressions. This includes:

  • Attribute parameters.
  • Default values of properties and parameters.
  • Constants and Class Constants.

#[\NoDiscard] attribute

Added the NoDiscard attribute to indicate that a function's return value is important and should be consumed.

Also, added the (void) cast to indicate that not using a value is intentional. The (void) cast has no effect on the program's execution by itself, but it can be used to suppress warnings emitted by #[\NoDiscard] and possibly also diagnostics emitted by external IDEs or static analysis tools.

<?php

#[\NoDiscard]
function concat(string $a, string $b): string {
     return $a . $b;
}

// Warning: The return value of function concat() should either be used or
// intentionally ignored by casting it as (void) in xxx.php
concat("a", "b");

// No warning, because the return value is consumed by the assignment.
$results = concat("a", "b");

// No warning, because the (void) cast is used.
(void)concat("a", "b");

Attributes on Constants

Added support for attributes on compile-time non-class constants (e.g. const MY_CONST = 1; rather than define('MY_CONST', 1);).

The Deprecated attribute can now be used on constants.

#[\DelayedTargetValidation] attribute

The new DelayedTargetValidation attribute can be used to suppress compile-time errors from core (or extension) attributes that are used on invalid targets. These errors are instead reported at runtime if and when ReflectionAttribute::newInstance() is called.

#[\Override] for properties

Override attribute can now be applied to properties.

Static Asymmetric Visibility

Added asymmetric visibility support for static properties.

Backtraces for Fatal Errors

Fatal Errors (such as an exceeded maximum execution time) now include a backtrace.

Constructor promotion for final property

Constructor property promotion can now be used for final properties.

Casts in constant expressions

Added support for casts in constant expressions.

<?php
const T1 = (int) 0.3; // Previously: "Fatal error: Constant expression contains invalid operations"
print T1 . PHP_EOL;   // Prints "0"

Clone function

The clone language construct is now a function and supports reassigning (readonly) properties during cloning via the new $withProperties parameter.

cURL

Added support for share handles that are persisted across multiple PHP requests, safely allowing for more effective connection reuse.

Added support for CURLINFO_USED_PROXY (libcurl >= 8.7.0), CURLINFO_HTTPAUTH_USED, and CURLINFO_PROXYAUTH_USED (libcurl >= 8.12.0) to the curl_getinfo() function. When curl_getinfo() returns an array, the same information is available as "used_proxy", "httpauth_used", and "proxyauth_used" keys. CURLINFO_USED_PROXY gets zero set if no proxy was used in the previous transfer or a non-zero value if a proxy was used. CURLINFO_HTTPAUTH_USED and CURLINFO_PROXYAUTH_USED get bitmasks indicating the HTTP and proxy authentication methods that were used in the previous request. See CURLAUTH_* constants for possible values.

Added CURLOPT_INFILESIZE_LARGE Curl option, which is a safe replacement for CURLOPT_INFILESIZE. On certain systems, CURLOPT_INFILESIZE only accepts a 32-bit signed integer as the file size (2.0 GiB) even on 64-bit systems. CURLOPT_INFILESIZE_LARGE accepts the largest integer value the system can handle.

Added CURLFOLLOW_OBEYCODE, CURLFOLLOW_FIRSTONLY and CURLFOLLOW_ALL values for CURLOPT_FOLLOWLOCATIONcurl_setopt() option. CURLFOLLOW_OBEYCODE to follow more strictly in regard to redirect if they are allowed. CURLFOLLOW_FIRSTONLY to follow only the first redirect thus if there is any follow up redirect, it won't go any further. CURLFOLLOW_ALL is equivalent to setting CURLOPT_FOLLOWLOCATION to true.

Added support for CURLINFO_CONN_ID (libcurl >= 8.2.0) to the curl_getinfo() function. This constant allows retrieving the unique ID of the connection used by a cURL transfer. It is primarily useful when connection reuse or connection pooling logic is needed in PHP-level applications. When curl_getinfo() returns an array, this value is available as the "conn_id" key.

Added support for CURLINFO_QUEUE_TIME_T (libcurl >= 8.6.0) to the curl_getinfo() function. This constant allows retrieving the time (in microseconds) that the request spent in libcurl’s connection queue before it was sent. This value can also be retrieved by passing CURLINFO_QUEUE_TIME_T to the curl_getinfo()option parameter.

Added support for CURLOPT_SSL_SIGNATURE_ALGORITHMS to specify the signature algorithms to use for TLS.

DOM

Added Dom\Element::$outerHTML.

Added $children property to Dom\ParentNode implementations.

EXIF

Added support for OffsetTime* Exif tags.

Added support for HEIF/HEIC.

Filter

Added new FILTER_THROW_ON_FAILURE flag which can be passed to the filter functions and will force an exception to be triggered when validation fails. The new flag cannot be combined with FILTER_NULL_ON_FAILURE; trying to do so will result in a ValueError being thrown.

Intl

Added class constants NumberFormatter::CURRENCY_ISO, NumberFormatter::CURRENCY_PLURAL, NumberFormatter::CASH_CURRENCY, and NumberFormatter::CURRENCY_STANDARD for various currency-related number formats.

Added Locale::addLikelySubtags() and Locale::minimizeSubtags() to handle likely tags on a given locale.

Added IntlListFormatter class to format, order, and punctuate a list of items with a given locale, IntlListFormatter::TYPE_AND, IntlListFormatter::TYPE_OR, IntlListFormatter::TYPE_UNITS operands and IntlListFormatter::WIDTH_WIDE, IntlListFormatter::WIDTH_SHORT and IntlListFormatter::WIDTH_NARROW widths. It is supported from icu 67.

Session

session_set_cookie_params(), session_get_cookie_params(), and session_start() now support partitioned cookies via the "partitioned" key.

SOAP

Enumeration cases are now dumped in SoapClient::__getTypes().

Added support for Soap 1.2 Reason Text xml:lang attribute.

The signature of SoapFault::__construct() and SoapServer::fault() therefore now have an optional lang parameter. This support solves compatibility with .NET SOAP clients.

Standard

mail() now returns the actual sendmail error and detects if the sendmail process was terminated unexpectedly. In such cases, a warning is emitted and the function returns false. Previously, these errors were silently ignored. This change affects only the sendmail transport.

getimagesize() now supports HEIF/HEIC images.

getimagesize() now supports SVG images when ext-libxml is also loaded. Similarly, image_type_to_extension() and image_type_to_mime_type() now also handle IMAGETYPE_SVG.

The array returned by getimagesize() now has two additional entries: "width_unit" and "height_unit" to indicate in which units the dimensions are expressed. These units are px by default. They are not necessarily the same (just to give one example: one may be cm and the other may be px).

setcookie() and setrawcookie() now support the "partitioned" key.

URI

An always enabled uri extension is added that can be used for handling URIs and URLs according to RFC 3986 and WHATWG URL.

XSL

The namespace argument of XSLTProcessor::getParameter(), XSLTProcessor::setParameter() and XSLTProcessor::removeParameter() now actually works instead of being treated as empty. This only works if the name argument does not use Clark notation and is not a QName because in those cases the namespace is taken from the namespace href or prefix respectively.

Zlib

flock() is now supported on zlib streams. Previously, this always failed to perform any locking action.

PHP 8.5+: передать результат следующему callable оператором |>Самостоятельный пример
<?php
$length = 'order-42' |> strtoupper(...) |> strlen(...);
echo $length, "\n";
Ожидаемый результат
8

Оператор |> передаёт левое значение как единственный аргумент callable справа. Это пример только для PHP 8.5+; в библиотеке с поддержкой 8.4 такой файл даже не распарсится.

PHP 8.4 → 8.5: Новые классы, интерфейсы и перечисления

Новые классы, интерфейсы и enum доступны только в указанной ветке PHP или расширения. Перед условной интеграцией проверяют версию и наличие расширения; для обязательной зависимости ранний отказ понятнее тихой деградации.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP 8.4 → 8.5: Новые функции и методы

Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP 8.4 → 8.5: Новые глобальные константы

Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Модуль cURL

  • CURLINFO_USED_PROXY
  • CURLINFO_HTTPAUTH_USED
  • CURLINFO_PROXYAUTH_USED
  • CURLINFO_CONN_ID
  • CURLINFO_QUEUE_TIME_T
  • CURLOPT_INFILESIZE_LARGE
  • CURLFOLLOW_ALL
  • CURLFOLLOW_OBEYCODE
  • CURLFOLLOW_FIRSTONLY

Модуль Filter

Модуль Intl

  • DECIMAL_COMPACT_SHORT
  • DECIMAL_COMPACT_LONG

Модуль POSIX

  • POSIX_SC_OPEN_MAX

Модуль Sockets

  • IPPROTO_ICMP
  • IPPROTO_ICMPV6
  • TCP_FUNCTION_BLK (только FreeBSD)
  • TCP_FUNCTION_ALIAS (только FreeBSD)
  • TCP_REUSPORT_LB_NUMA (только FreeBSD)
  • TCP_REUSPORT_LB_NUMA_NODOM (только FreeBSD)
  • TCP_REUSPORT_LB_NUMA_CURDOM (только FreeBSD)
  • TCP_BBR_ALGORITHM (только FreeBSD)
  • AF_PACKET (только Linux)
  • IP_BINDANY (только FreeBSD/NetBSD/OpenBSD)
  • SO_BUSY_POLL (только Linux)
  • UDP_SEGMENT (только Linux)
  • SHUT_RD
  • SHUT_WR
  • SHUT_RDWR

Модуль Tokenizer

Стандартные модули

  • IMAGETYPE_HEIF
  • IMAGETYPE_SVG, если доступен модуль libxml.
Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP 8.4 → 8.5: Обратно несовместимые изменения

Это обязательный список рисков: прежний код может компилироваться, но вернуть другой тип, выбросить исключение или изменить порядок действий. Каждый относящийся к проекту пункт превращают в отдельный тест до обновления.

Полный официальный договор страницы — большой справочник, раскрывается по запросу

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Ядро PHP

Псевдонимы "array" и "callable"

Слова "array" и "callable" больше нельзя указывать как псевдонимы классов при вызове функции class_alias().

Нестрогое сравнение несравнимых объектов

Нестрогое сравнение несравнимых объектов — перечислений, объектов CurlHandle и других внутренних классов — с логическими значениями прежде оставалось непоследовательным. При сравнении с логическим литералом в выражениях наподобие $object == true объект неявно приводился к логическому значению, как если бы сравнение выполняли с явным приведением типа: (bool) $object. При сравнении со значением, которое невозможно вычислить в статическом контексте, — в выражениях наподобие $object == $true, возвращалось значение false. Поведение унифицировали: объекты без внутренней логики сравнения теперь сравниваются только после неявного приведения (bool) $object.

Значение возврата функции gc_collect_cycles

Значение, которое возвращает функция gc_collect_cycles(), больше не включает строки и ресурсы, которые сборщик мусора попутно собрал при удалении циклических ссылок.

Замена ключевого слова static в окончательном подклассе

В окончательных подклассах ключевое слово static разрешили заменять на self или название конкретного класса.

Обработчики тиков

Обработчики тиков теперь деактивируются после выполнения всех функций завершения работы, запуска деструкторов и очистки обработчиков вывода.

Связывание трейтов

Теперь трейты связываются до родительского класса. Небольшое изменение в поведении, которое больше соответствует ожиданиям пользователей.

Ошибки при компиляции и связывании классов

Ошибки, возникающие во время компиляции и связывания классов, теперь всегда откладываются и обрабатываются после компиляции или связывания классов. Фатальные ошибки, возникающие во время компиляции или связывания классов, приводят к немедленной обработке всех отложенных ошибок без вызова пользовательских обработчиков ошибок.

Исключения, выбрасываемые пользовательским обработчиком ошибок

Исключения, выбрасываемые пользовательскими обработчиками ошибок при обработке ошибок связывания классов, больше не повышаются до уровня фатальных ошибок и не препятствуют связыванию.

Ошибка применения атрибута во время компиляции

Применение #[\Attribute] к абстрактному классу, перечислению, интерфейсу или трейту вызывает ошибку во время компиляции. Ранее атрибут можно было добавить, но при вызове метода ReflectionAttribute::newInstance() выдавалась ошибка. Ошибку можно отложить с момента компиляции до момента выполнения с помощью нового атрибута #[\DelayedTargetValidation].

Директива disable_classes

INI-настройку disable_classes удалили, поскольку отключение внутренних классов нарушало работу движка и делало поведение программы непредсказуемым.

Деструктуризация значений кроме массивов

Деструктуризация значений, кроме массивов и null, конструкцией [] или функцией list() теперь выдаёт предупреждение.

Предупреждения, связанные с приведением типов

При преобразовании в целые числа чисел с плавающей точкой или строк, похожих на числа с плавающей точкой, теперь выдаётся предупреждение, если значения невозможно представить в виде целого числа. Это касается явных и неявных преобразований в целые числа.

При преобразовании значения NAN в другие типы теперь выдаётся предупреждение.

Модуль Bzip2

Функция bzcompress() теперь выбрасывает ошибку ValueError, если значение параметра $block_size выходит за пределы диапазона от 1 до 9.

Функция bzcompress() теперь выбрасывает ошибку ValueError, если значение параметра $work_factor выходит за пределы диапазона от 0 до 250.

Модуль DOM

Клонирование объектов DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection и Dom\DtdNamedNodeMap теперь выбрасывает ошибку. Такое поведение никогда не создавало рабочие объекты, поэтому изменение не повлияет на код, который написали на предыдущих версиях языка.

Модуль FileInfo

Функция finfo_file() и метод finfo::file() теперь выбрасывают ошибку ValueError вместо TypeError, если значение параметра $filename содержит нулевые байты. Теперь тип выбрасываемой ошибки соответствует остальной частью языка.

Модуль интернационализации

Для работы модуля теперь требуется как минимум ICU 57.1.

Метод IntlDateFormatter::setTimeZone() и функция datefmt_set_timezone() теперь выбрасывают исключение IntlException при неинициализированных классах или ошибках клонирования.

Все методы класса Locale теперь выбрасывают исключение ValueError, если значение параметра locale содержит нулевые байты.

Поведение константы Collator::SORT_REGULAR при обработке числовых строк теперь соответствует поведению SORT_REGULAR в модуле ext/standard.

Модуль LDAP

Функция ldap_get_option() и ldap_set_option() теперь выбрасывают исключение ValueError при передаче недопустимого параметра.

Модуль MBString

Таблицы данных Unicode были обновлены до версии Unicode 17.0.

Модуль MySQLi

Вызов конструктора на объекте mysqli теперь невозможен и выбрасывает ошибку Error.

Модуль ODBC

ODBC теперь предполагает, что доступна как минимум функциональность ODBC 3.5. Определение ODBCVER и флаги системы сборки, управляющие им, были удалены.

ODBC больше не включает флаги сборки для сборки с конкретными драйверами (за исключением DB2) и удаляет особые случаи для этих драйверов. Настоятельно рекомендуется использовать диспетчер драйверов наподобие iODBC или unixODBC на операционных системах кроме Windows.

Модуль Opcache

Модуль Opcache встроили в бинарный файл PHP, поэтому модуль не требует отдельной установки и загружается автоматически. INI-директивы opcache.enable и opcache.enable_cli по-прежнему работают.

Флаги конфигурации --enable-opcache/--disable-opcache были удалены и сборка больше не создаёт объекты opcache.so или php_opcache.dll.

INI-директивы zend_extension=opcache.so и zend_extension=php_opcache.dll теперь выдают предупреждение.

Модуль PCNTL

Функция pcntl_exec() теперь выбрасывает ошибку ValueError, если элементы параметра $args содержат нулевые байты..

Функция pcntl_exec() теперь выбрасывает ошибку ValueError, если записи или ключи параметра $env_vars содержат нулевые байты.

Модуль PCRE

Модуль скомпилирован без полуустаревшего параметра компиляции PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK.

Модуль PDO

Аргументы, которые передаются в конструктор класса при установке режима PDO::FETCH_CLASS, теперь обрабатываются по правилам стандартной семантики функции call_user_func_array(), поэтому строковые ключи интерпретируются как именованные аргументы. При передаче в параметр, который ожидает аргумент по ссылке, значения, а не переменной, аргумент автоматически оборачивался во временную переменную. Это поведение тоже удалили и теперь выдаётся стандартное предупреждение E_WARNING. Для передачи в аргументе конструктора переменной по ссылке в массиве переменной по ссылке значение массива присваивают по ссылке: $ctor_args = [&$valByRef].

При попытке вызова метода PDOStatement::setFetchMode() в контексте работы методов PDOStatement::fetch(), PDOStatement::fetchObject() или PDOStatement::fetchAll() — например, при передаче объекта запроса в конструктор в режиме извлечения данных в объект — теперь выбрасывается ошибка Error.

Изменились значения констант PDO::FETCH_GROUP, PDO::FETCH_UNIQUE, PDO::FETCH_CLASSTYPE, PDO::FETCH_PROPS_LATE и PDO::FETCH_SERIALIZE.

При попытке указать опцию PDO::FETCH_PROPS_LATE с несовместимыми режимами извлечения теперь выбрасывается ошибка ValueError, как и при других несовместимых комбинациях флагов. Опция совместима только с режимом PDO::FETCH_CLASS.

При попытке выбрать строки методом PDOStatement::fetchAll() в режиме PDO::FETCH_INTO теперь выбрасывается ошибка ValueError — как и в режиме выборки PDO::FETCH_LAZY.

Драйвер PDO_FIREBIRD

При попытке установить слишком длинное имя курсора в классе PDOStatement, полученном от драйвера Firebird, теперь выбрасывается ошибка ValueError.

Драйвер PDO_SQLITE

SQLite PDO::quote() теперь выбрасывает исключение или выдаёт предупреждение, в зависимости от режима ошибок, если строка содержит нулевой байт.

Метод PDO::sqliteCreateCollation() теперь выбрасывает исключение, если у callback-функции неправильный тип возвращаемого значения, что повышает совместимость с поведением метода Pdo\Sqlite::createCollation().

Модуль POSIX

Функция posix_kill() теперь выбрасывает исключение ValueError, если аргумент process_id меньше или больше, чем поддерживает платформа (целое число со знаком или большой диапазон), функция posix_setpgid() теперь выбрасывает исключение ValueError, если process_id или process_group_id меньше нуля или больше, чем поддерживает платформа.

Функция posix_setrlimit() теперь выбрасывает исключение ValueError, если аргументы hard_limit или soft_limit меньше -1 или если soft_limit больше hard_limit.

Модуль интроспекции кода Reflection

Метод ReflectionAttribute::newInstance() теперь выбросит ошибку для внутренних атрибутов, если атрибут применили к недопустимой цели, а выдачу ошибки отложили с компиляции на момент выполнения атрибута #[\DelayedTargetValidation].

Модуль Session

Попытка записать данные сессии, где ключ массива $_SESSION содержит символ вертикальной черты (|), теперь выдаёт предупреждение вместо молчаливой ошибки.

Функция session_start() строже относится к аргументу options. Функция теперь выбрасывает ошибку ValueError, если массив не является хеш-картой, или ошибку TypeError, если значение read_and_close не является допустимым типом, совместимым с int.

Модуль SimpleXML

Передача выражения XPath, которое возвращает что-либо, кроме набора узлов, в методе SimpleXMLElement::xpath() теперь выдаёт предупреждение и возвращает значение false, вместо того, чтобы молчаливо завершаться с ошибкой и возвращать пустой массив.

Модуль SNMP

Функции snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() и SNMP::__construct() теперь выбрасывают ошибку ValueError, если имя хоста слишком большое, содержит нулевые байты или если порт указан с отрицательным значением или больше 65535, а значения времени ожидания и повторных попыток меньше -1 или слишком большое.

Модуль SOAP

Метод SoapClient::__doRequest() теперь принимает новый необязательный параметр $uriParserClass, который принимает строковые аргументы или null. Значение null представляет исходный метод — parse_url(), а новые обработчики устанавливаются при передаче либо объекта Uri\Rfc3986\Uri, либо объекта Uri\WhatWg\Url.

Модуль Sockets

Функции socket_create_listen(), socket_bind() и socket_sendto() теперь выбрасывают ошибку ValueError, если порт меньше 0 или больше 65535, а также если хотя бы один элемент массива $hints содержит числовой индекс.

Функция socket_addrinfo_lookup() теперь выбрасывает ошибку TypeError, если какое-то значение параметра $hints невозможно преобразовать в целое число, и ошибку ValueError при переполнении значения параметра.

Функция socket_set_option() с опциями MCAST_LEAVE_GROUP/MCAST_LEAVE_SOURCE_GROUP теперь выбрасывает исключение, если значение не является корректным объектом или массивом.

Функция socket_set_option() с контекстом многоадресной рассылки теперь выбрасывает ошибку ValueError, если созданный сокет не принадлежит семейству AF_INET/AF_INET6.

Модуль SPL

Класс ArrayObject больше не принимает перечисления, поскольку изменение свойства $name или $value нарушило бы требование о неизменности перечисления и сделало бы обработку изменённого перечисления движком непредсказуемой или даже невозможной.

Параметр $length метода SplFileObject::fwrite() теперь принимает значение null. Значение по умолчанию изменилось с 0 на null.

Стандартные модули

Функции семейства printf теперь обрабатывают пропуск спецификатора точности в строке формата как точность со значением 0; раньше при пропуске спецификатора точность ошибочно сбрасывалась.

Передача целочисленного значения 0 в аргументе locales функции setlocale() больше не поддерживается и теперь выбрасывает ошибку TypeError.

Модуль Tidy

Методы tidy::__construct(), tidy::parseFile(), tidy::parseString() теперь выбрасывают ошибку ValueError, если конфигурация содержит некорректное значение или пытается установить внутреннюю запись, доступную только для чтения, и ошибку TypeError, если ключ конфигурации не является строкой.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP Core

"array" and "callable" alias name

It is no longer possible to use "array" and "callable" as class alias names in class_alias()

Loosely comparing uncomparable objects

Loosely comparing uncomparable objects (e.g. enums, CurlHandle and other internal classes) to booleans was previously inconsistent. If compared to a boolean literal $object == true, it would behave the same way as (bool)$object. If compared to a statically unknown value $object == $true, it would always return false. This behavior was consolidated to always follow the behavior of (bool)$object.

Return value of gc_collect_cycles

The return value of gc_collect_cycles() no longer includes strings and resources that were indirectly collected through cycles.

Substitute static keyword in final subclass

It is now allowed to substitute static with self or the concrete class name in final subclasses.

Tick handlers

The tick handlers are now deactivated after all shutdown functions, destructors have run and the output handlers have been cleaned up.

Traits binding

Traits are now bound before the parent class. This is a subtle behavioral change, but should more closely match user expectations.

Errors during compilation and class linking

Errors emitted during compilation and class linking are now always delayed and handled after compilation or class linking. Fatal errors emitted during compilation or class linking cause any delayed errors to be handled immediately, without calling user-defined error handlers.

Exceptions thrown by user-defined error handler

Exceptions thrown by user-defined error handlers when handling class linking errors are not promoted to fatal errors anymore and do not prevent linking.

Attribute apply error during compilation

Applying #[\Attribute] to an abstract class, enum, interface, or trait triggers an error during compilation. Previously, the attribute could be added, but when ReflectionAttribute::newInstance() was called an error would be thrown. The error can be delayed from compilation to runtime using the new #[\DelayedTargetValidation] attribute.

disable_classes INI setting

The disable_classes INI setting has been removed as it causes various engine assumptions to be broken.

Destructuring non-array values

Destructuring non-array values (other than null) using [] or list() now emits a warning.

Warnings related to cast

A warning is now emitted when casting floats (or strings that look like floats) to int if they cannot be represented as one. This affects explicit int casts and implicit int casts.

A warning is now emitted when casting NAN to other types.

Bzip2

bzcompress() now throws a ValueError when block_size is not between 1 and 9.

bzcompress() now throws a ValueError when work_factor is not between 0 and 250.

DOM

Cloning a DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection, and Dom\DtdNamedNodeMap now fails. This never actually resulted in a working object, therefore no impact is expected.

FileInfo

finfo_file() and finfo::file() now throws a ValueError instead of a TypeError when filename contains nul bytes. This aligns the type of Error thrown to be consistent with the rest of the language.

Intl

The extension now requires at least ICU 57.1.

IntlDateFormatter::setTimeZone()/datefmt_set_timezone() now throws an IntlException on uninitialised classes/clone failures.

All Locale methods now throw a ValueError when the locale argument contain null bytes.

The behaviour of Collator::SORT_REGULAR with respect to handling numeric strings is now aligned with the behaviour of SORT_REGULAR in ext/standard.

LDAP

ldap_get_option() and ldap_set_option() now throw a ValueError when passing an invalid option.

MBString

Unicode data tables have been updated to Unicode 17.0

MySQLi

Calling the mysqli constructor on an already-constructed object is now no longer possible and throws an Error.

ODBC

ODBC now assumes that at least ODBC 3.5 functionality is available. The ODBCVER definition and build system flags to control it have been removed.

ODBC no longer has build flags to build against specific drivers (except for DB2) and removes special cases for those drivers. It is strongly recommended to use a driver manager like iODBC or unixODBC on non-Windows.

Opcache

The Opcache extension is now always built into the PHP binary and is always loaded. The INI directives opcache.enable and opcache.enable_cli are still honored.

The --enable-opcache/--disable-opcache configure flags have been removed, and the build does not produce opcache.so or php_opcache.dll objects anymore.

Using zend_extension=opcache.so or zend_extension=php_opcache.dll INI directives will emit a warning.

PCNTL

pcntl_exec() now throws ValueError when entries of the args parameter contain null bytes.

pcntl_exec() now throws ValueError when entries or keys of the env_vars parameter contain null bytes.

PCRE

The extension is compiled without semi-deprecated PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK compile option.

PDO

The constructor arguments set in conjunction with PDO::FETCH_CLASS now follow the usual CUFA (call_user_func_array()) semantics. This means string keys will act like a named argument. Moreover, automatic wrapping for by-value arguments passed to a by-ref parameter has been removed, and the usual E_WARNING about this is now emitted. To pass a variable by-ref to a constructor argument use the general array value reference assignment: $ctor_args = [&$valByRef]

Attempting to call PDOStatement::setFetchMode() during a call to PDOStatement::fetch(), PDOStatement::fetchObject(), PDOStatement::fetchAll(), for example using tricks such as passing the statement object as a constructor argument when fetching into an object, will now throw an Error.

The value of the constants PDO::FETCH_GROUP, PDO::FETCH_UNIQUE, PDO::FETCH_CLASSTYPE, PDO::FETCH_PROPS_LATE, and PDO::FETCH_SERIALIZE have changed.

A ValueError is now thrown if PDO::FETCH_PROPS_LATE is used with a fetch mode different than PDO::FETCH_CLASS, consistent with other fetch flags.

A ValueError is now thrown if PDO::FETCH_INTO is used as a fetch mode in PDOStatement::fetchAll(), similar to PDO::FETCH_LAZY.

PDO_FIREBIRD

A ValueError is now thrown when trying to set a cursor name that is too long on a PDOStatement resulting from the Firebird driver.

PDO_SQLITE

SQLite PDO::quote() will now throw an exception or emit a warning, depending on the error mode, if the string contains a null byte.

PDO::sqliteCreateCollation() will now throw an exception if the callback has the wrong return type, making it more in line with Pdo\Sqlite::createCollation() behavior.

POSIX

posix_kill() now throws a ValueError when the process_id argument is lower or greater than what the platform supports (signed integer or long range), posix_setpgid() now throws a ValueError when the process_id or the process_group_id is lower than zero or greater than what the platform supports.

posix_setrlimit() now throws a ValueError when the hard_limit or soft_limit arguments are lower than -1 or if soft_limit is greater than hard_limit.

Reflection

ReflectionAttribute::newInstance() can now throw errors for internal attributes if the attribute was applied on an invalid target and the error was delayed from compile time to runtime via the #[\DelayedTargetValidation] attribute.

Session

Attempting to write session data where $_SESSION has a key containing the pipe character (|) will now emit a warning instead of silently failing.

session_start() is stricter in regard to the options argument. It now throws a ValueError if the array is not a hashmap, or a TypeError if the read_and_close value is not a valid type compatible with int.

SimpleXML

Passing an XPath expression that returns something other than a node set to SimpleXMLElement::xpath() will now emit a warning and return false, instead of silently failing and returning an empty array.

SNMP

snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() and SNMP::__construct() now throw a ValueError when the hostname is too large, contains any null byte or if the port is given when negative or greater than 65535, timeout and retries values are lower than -1 or too large.

SOAP

SoapClient::__doRequest() now accepts a new, optional uriParserClass parameter accepting string or null arguments. null represents the original (parse_url()) based method, while the new backends will be used when passing either Uri\Rfc3986\Uri or Uri\WhatWg\Url.

Sockets

socket_create_listen(), socket_bind() and socket_sendto() now throw a ValueError if the port is lower than 0 or greater than 65535, and also if any of the hints array entries are indexed numerically.

socket_addrinfo_lookup() now throws a TypeError if any of the hints values cannot be cast to int and can throw a ValueError if any of these values overflow.

socket_set_option() with MCAST_LEAVE_GROUP/MCAST_LEAVE_SOURCE_GROUP options now throw an exception if the value isn't a valid object or array.

socket_set_option() with multicast context now throws a ValueError when the created socket is not of AF_INET/AF_INET6 family.

SPL

ArrayObject no longer accepts enums, as modifying the $name or $value properties can break engine assumptions.

SplFileObject::fwrite()'s parameter length is now nullable. The default value changed from 0 to null.

Standard

Using a printf-family function with a formatter that did not specify the precision previously incorrectly reset the precision instead of treating it as a precision of 0.

Passing an integer 0 as the locales argument to setlocale() is no longer supported and now throws a TypeError.

Tidy

tidy::__construct(), tidy::parseFile(), tidy::parseString() now throws a ValueError if the configuration contains an invalid value or attempts to set a read-only internal entry, and a TypeError if a configuration key is not a string.

PHP 8.4 → 8.5: Устаревшие возможности

Устаревание — раннее предупреждение, а не немедленное удаление. На тестовом контуре включают E_ALL, собирают deprecation без подавления, выбирают замену и исправляют собственный код до следующей мажорной версии.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Ядро PHP

Изменения в обработчике вывода пользователя

Попытка вывода результатов (например, с помощью функции echo) в рамках обработчика вывода пользователя объявлена устаревшей. Предупреждение об устаревании будет игнорировать обработчик, производящий вывод, чтобы обеспечить его видимость; если есть вложенные обработчики вывода, следующий из них всё равно будет использоваться.

Неканонические названия типов

Неканонические имена типов (boolean), (integer), (double), и (binary) объявлены устаревшими, используйте вместо них (bool), (int), (float) и (string) соответственно.

Завершение операторов case точкой с запятой

Завершение операторов case точкой с запятой вместо двоеточия больше не поддерживается.

Операторы выполнения

Обратный машинописный апостроф как псевдоним функции shell_exec() больше не поддерживается.

Возвращение null функцией __debugInfo()

Возвращение null функцией __debugInfo() больше не поддерживается. Вместо этого возвращается пустой массив.

INI-настройка report_memleaks

INI-настройка report_memleaks объявлена устаревшей.

Повторное объявление констант

Повторное объявление констант объявлено устаревшим. Обратите внимание, что это уже вызвало предупреждение и будет вызывать его и в дальнейшем.

Проблемы со связыванием замыканий

Следующие проблемы с привязкой замыкания, которые уже выдают ошибку уровня E_WARNING, теперь считаются устаревшими:

  • Привязка экземпляра к статическому замыканию.
  • Связывание методов с объектами, которые не являются экземплярами класса (или подкласса), в котором метод определен.
  • Отвязывание $this от метода.
  • Отвязывание $this от замыкания, которое использует `$this`.
  • Привязка замыкания к области действия внутреннего класса.
  • Перепривязывание области действия замыкания, созданного функцией или методом.

Магические методы __sleep() и __wakeup()

Магические методы __sleep() и __wakeup() были мягко объявлены устаревшими. Вместо них следует использовать магические методы __serialize() и __unserialize(), либо использовать их одновременно, если требуется совместимость с PHP 7.

Использование null в качестве смещения массива

Использование null в качестве смещения массива или при вызове array_key_exists() объявлено устаревшим. Вместо этого следует использовать пустую строку.

Увеличение нечисловых строк

Увеличение нечисловых строк объявлено устаревшим. Вместо этого следует использовать функцию str_increment().

INI-настройка register_argc_argv

Извлечение $_SERVER['argc'] и $_SERVER['argv'] из строки запроса для не-CLI SAPIs больше не поддерживается. Настройте register_argc_argv=0 и переключитесь на $_GET или $_SERVER['QUERY_STRING'] для доступа к информации после проверки безопасности использования.

Модуль cURL

Функция curl_close() устарела, поскольку объекты CurlHandle освобождаются автоматически.

Функция curl_share_close() устарела, поскольку объекты CurlShareHandle освобождаются автоматически.

Модуль работы с датой и временем

Константы DATE_RFC7231 и DateTimeInterface::RFC7231 устарели. Это связано с тем, что связанный с ними часовой пояс игнорируется и всегда используется GMT.

Модуль FileInfo

Функция finfo_close() устарела, поскольку объекты finfo освобождаются автоматически.

Параметр $context функции finfo_buffer() устарел, так как игнорируется.

Модуль GD

Функция imagedestroy() устарела, поскольку объекты GdImage освобождаются автоматически.

Фреймворк HASH

Константы MHASH_* устарели.

Модуль интернационализации

INI-настройка intl.error_level устарела. Ошибки следует проверять вручную или включить исключения с помощью INI-настройки intl.use_exceptions.

Модуль LDAP

Определённые вызовы и константы Oracle Instant Client устарели. Список затронутых вызовов:

Список затронутых констант:
  • GSLC_SSL_NO_UATH
  • GSLC_SSL_ONEWAY_UATH
  • GSLC_SSL_TWOWAY_UATH

Модуль MySQLi

Функция-псевдоним mysqli_execute() устарела. Вместо неё используйте функцию mysqli_stmt_execute().

Модуль OpenSSL

Параметр $key_length функции openssl_pkey_derive() устарел. Это связано с тем, что он либо игнорируется, либо обрезает ключ, что может представлять угрозу безопасности.

Модуль PDO

Схема DSN "uri:" объявлена устаревшей из-за проблем безопасности, связанных с DSN, поступающими из удалённых URI.

Константы, специфичные для драйвера, в классе PDO объявлены устаревшими. Список затронутых констант и их замены:

Методы, специфичные для драйвера, в классе PDO объявлены устаревшими. Список затронутых методов и их замены:

Драйвер PDO_PGSQL

Константы, связанные с состояниями транзакций, объявлены устаревшими, поскольку функция недоступна в PDO:

  • PDO::PGSQL_TRANSACTION_IDLE
  • PDO::PGSQL_TRANSACTION_ACTIVE
  • PDO::PGSQL_TRANSACTION_INTRANS
  • PDO::PGSQL_TRANSACTION_INERROR
  • PDO::PGSQL_TRANSACTION_UNKNOWN

Модуль интроспекции кода Reflection

Методы setAccessible() различных объектов Reflection устарели, поскольку они больше не имеют значения.

Вызов метода ReflectionClass::getConstant() для констант, которые не существуют, больше не поддерживается.

Вызов метода ReflectionProperty::getDefaultValue() для свойств без значений по умолчанию больше не поддерживается.

Стандартная библиотека PHP (SPL)

Отмена регистрации всех автозагрузчиков путём передачи функции spl_autoload_call() в качестве callback-аргумента функции spl_autoload_unregister() больше не поддерживается. Вместо этого, если это необходимо, следует пройтись по возвращаемому значению функции spl_autoload_functions() и вызвать функцию spl_autoload_unregister() для каждого значения.

Методы SplObjectStorage::contains(), SplObjectStorage::attach() и SplObjectStorage::detach() были признаны устаревшими и заменены на SplObjectStorage::offsetExists(), SplObjectStorage::offsetSet() и SplObjectStorage::offsetUnset() соответственно.

Использование классов ArrayObject и ArrayIterator с объектами больше не поддерживается.

Стандартные модули

Функция-псевдоним socket_set_timeout() больше не поддерживается. Вместо неё используйте функцию stream_set_timeout().

Передача null функциям readdir(), rewinddir() и closedir() для использования последнего открытого каталога больше не поддерживается. Вместо этого явно укажите последний открытый каталог.

Передача целых чисел за пределами интервала [0, 255] функции chr() теперь не рекомендуется. Это связано с тем, что байт может содержать только значение в пределах этого интервала.

Передача строки, которая не является однобайтовой функции ord() устарела, это указывает на наличие ошибки.

Локально предопределенная переменная $http_response_header устарела. Вместо этого следует вызывать функцию http_get_last_response_headers().

Модуль XML

Функция xml_parser_free() устарела, поскольку объекты XMLParser освобождаются автоматически.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

PHP Core

Changes to user output handler

Trying to produce output (e.g. with echo) within a user output handler is deprecated. The deprecation warning will bypass the handler producing the output to ensure it is visible; if there are nested output handlers the next one will still be used.

Non-canonical cast names

Non-canonical cast names (boolean), (integer), (double), and (binary) have been deprecated, use (bool), (int), (float), and (string) respectively.

Terminating case statements with a semicolon

Terminating case statements with a semicolon instead of a colon has been deprecated.

The backtick operator

The backtick operator as an alias for shell_exec() has been deprecated.

Returning null from __debugInfo()

Returning null from __debugInfo() has been deprecated. Return an empty array instead.

report_memleaks INI directive

The report_memleaks INI directive has been deprecated.

Constant redeclaration

Constant redeclaration has been deprecated. Note that this already generated a warning and will continue to do so.

Closure binding issues

The following closure binding issues, which already emit an E_WARNING, are now deprecated:

  • Binding an instance to a static closure.
  • Binding methods to objects that are not instances of the class (or subclass) that the method is defined.
  • Unbinding $this from a method.
  • Unbinding $this from a closure that uses `$this`.
  • Binding a closure to the scope of an internal class.
  • Rebinding the scope of a closure created from a function or method.

__sleep() and __wakeup() magic methods

The __sleep() and __wakeup() magic methods have been soft-deprecated. The __serialize() and __unserialize() magic methods should be used instead, or at the same time if compatibility with PHP 7 is required.

Using null as an array offset

Using null as an array offset or when calling array_key_exists() is now deprecated. Instead an empty string should be used.

Incrementing non-numeric strings

Incrementing non-numeric strings is now deprecated. Instead the str_increment() function should be used.

register_argc_argv INI directive

Deriving $_SERVER['argc'] and $_SERVER['argv'] from the query string for non-CLI SAPIs has been deprecated. Configure register_argc_argv=0 and switch to either $_GET or $_SERVER['QUERY_STRING'] to access the information, after verifying that the usage is safe.

cURL

The curl_close() function has been deprecated, as CurlHandle objects are freed automatically.

The curl_share_close() function has been deprecated, as CurlShareHandle objects are freed automatically.

Date

The DATE_RFC7231 and DateTimeInterface::RFC7231 constants have been deprecated. This is because the associated timezone is ignored and always uses GMT.

FileInfo

The finfo_close() function has been deprecated. As finfo objects are freed automatically.

The context parameter of the finfo_buffer() function has been deprecated as it is ignored.

GD

The imagedestroy() function has been deprecated, as GdImage objects are freed automatically.

Hash

The MHASH_* constants have been deprecated.

Intl

The intl.error_level INI setting has been deprecated. Errors should either be checked manually or exceptions should be enabled by using the intl.use_exceptions INI setting.

LDAP

Specific Oracle Instant Client calls and constants have been deprecated. List of affected calls:

List of affected constants:
  • GSLC_SSL_NO_UATH
  • GSLC_SSL_ONEWAY_UATH
  • GSLC_SSL_TWOWAY_UATH

MySQLi

The mysqli_execute() alias function has been deprecated. Use mysqli_stmt_execute() instead.

OpenSSL

The key_length parameter for openssl_pkey_derive() has been deprecated. This is because it is either ignored, or truncates the key, which can be a security vulnerability.

PDO

The "uri:" DSN scheme has been deprecated due to security concerns with DSNs coming from remote URIs.

Driver specific constants in the PDO class have been deprecated. List of affected constants and their replacement:

Driver specific methods in the PDO class have been deprecated. List of affected methods and their replacement:

PDO_PGSQL

Constants related to transaction states have been deprecated as this feature is unavailable with PDO:

Reflection

The setAccessible() methods of various Reflection objects have been deprecated, as those no longer have an effect.

Calling ReflectionClass::getConstant() for constants that do not exist has been deprecated.

Calling ReflectionProperty::getDefaultValue() for properties without default values has been deprecated.

SPL

Unregistering all autoloaders by passing the spl_autoload_call() function as a callback argument to spl_autoload_unregister() has been deprecated. Instead if this is needed, one should iterate over the return value of spl_autoload_functions() and call spl_autoload_unregister() on each value.

The SplObjectStorage::contains(), SplObjectStorage::attach(), and SplObjectStorage::detach() methods have been deprecated in favour of SplObjectStorage::offsetExists(), SplObjectStorage::offsetSet(), and SplObjectStorage::offsetUnset() respectively.

Using ArrayObject and ArrayIterator with objects has been deprecated.

Standard

The socket_set_timeout() alias function has been deprecated. Use stream_set_timeout() instead.

Passing null to readdir(), rewinddir(), and closedir() to use the last opened directory has been deprecated. Provide the last opened directory explicitly instead.

Passing integers outside the interval [0, 255] to chr() is now deprecated. This is because a byte can only hold a value within this interval.

Passing a string which is not a single byte to ord() is now deprecated, this is indicative of a bug.

The locally predefined variable $http_response_header is deprecated. Instead one should call the http_get_last_response_headers() function.

XML

The xml_parser_free() function has been deprecated, as XMLParser objects are freed automatically.

PHP 8.4 → 8.5: Другие изменения

Сюда попадают изменения поведения, конфигурации и расширений, которые не образуют новую синтаксическую конструкцию. Их сверяют с фактически установленными модулями и рабочими сценариями проекта.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Изменения в ядре

Ядро PHP

Время высокого разрешения (hrtime()) в macOS теперь использует рекомендуемый clock_gettime_nsec_np(CLOCK_UPTIME_RAW) API вместо mach_absolute_time().

CGI/CLI

Опция -z или --zend-extension удалена, так как не функционировала. Вместо неё используйте -d zend_extension=[path].

PDO_ODBC

Изменено поведение при извлечении данных из больших столбцов. Вместо извлечения блоков по 256 байт PDO_ODBC будет пытаться извлекать блоки большего размера; в настоящее время это размер страницы за вычетом накладных расходов на строку. Драйверы, которые возвращают SQL_NO_TOTAL в SQLGetData, также обрабатываются лучше.

Изменения в модулях SAPI

CLI

Попытка установить слишком длинное название процесса с помощью функции cli_set_process_title() теперь приведёт к ошибке, а не к молчаливому усечению заданного названия.

Добавлена новая опция --ini=diff для вывода INI-настройки, отличной от установленной по умолчанию.

FPM

FPM с httpd ProxyPass опционально декодирует полный путь к скрипту. Добавлена INI-настройка fastcgi.script_path_encoded, чтобы предотвратить обновлённое поведение.

Ограничение журнала доступа FPM теперь учитывает значение log_limit.

Изменённые функции

Функции интернационализации

Функция grapheme_extract() правильно присваивает значение $next при пропуске недопустимых начальных байтов. Ранее были случаи, когда значение параметра указывало на начало границы графема, а не на конец.

Из сигнатуры функций transliterator_get_error_code(), transliterator_get_error_message(), TransLiterator::getErrorCode() и TransLiterator::getErrorMessage() убрано возвращаемое значение false. Возвращение значения false на самом деле никогда не было возможным.

Следующие функции теперь поддерживают параметр $locale: grapheme_strpos(), grapheme_stripos(), grapheme_strrpos(), grapheme_strripos(), grapheme_substr(), grapheme_strstr() и grapheme_stristr().

Функции LDAP

Функция ldap_get_option() теперь принимает соединение null, как и функция ldap_set_option(), чтобы обеспечить возможность извлечения глобальных опций.

Функции libxml

Тип возвращаемого значения функции libxml_set_external_entity_loader() изменён на true.

Функции OpenSSL

Добавлен новый параметр $digest_algo функциям openssl_public_encrypt() и openssl_private_decrypt(), который позволяет указать алгоритм хеширования для заполнения OAEP.

Добавлен новый параметр $padding функциям openssl_sign() и openssl_verify(), openssl_sign() and openssl_verify() have a new parameter $padding, который позволяет использовать более безопасную подкладку RSA PSS.

Параметр $cipher_algo функции openssl_cms_encrypt() может быть строкой с именем шифра. Это позволяет использовать больше алгоритмов, включая алгоритмы шифрования AES GCM для данных с авторизацией.

Функции PCNTL

Тип возвращаемого значения функции pcntl_exec() изменён на false.

Функция pcntl_waitid() принимает дополнительный аргумент resource_usage для сбора различных платформенных метрик о дочернем процессе.

Функции PDO_PGSQL

Метод Pdo\Pgsql::copyFromArray() теперь поддерживает входные данные типа iterable.

Метод Pdo\Pgsql::setAttribute() и Pdo\Pgsql::prepare() поддерживают установку значения PDO::ATTR_PREFETCH в 0, что переводит систему в режим отложенной выборки. В этом режиме операторы не могут выполняться параллельно.

Функции PostgreSQL

Функция pg_copy_from() теперь поддерживает входные данные типа iterable.

Функция pg_connect() проверяет, содержит ли аргумент connection_string нулевой байт.

Функция pg_close_stmt() проверяет, содержит ли аргумент statement_name нулевой байт.

Функции POSIX

Функция posix_ttyname() устанавливает last_error в EBADF при обнаружении некорректного файлового дескриптора.

Функция posix_isatty() выдаёт ошибку уровня E_WARNING при обнаружении некорректного файлового дескриптора.

Функция posix_fpathconf() проверяет некорректные файловые дескрипторы, устанавливает last_error в EBADF и выдаёт ошибку уровня E_WARNING.

Функции интроспекции кода Reflection

Вывод метода ReflectionClass::__toString() для перечислений изменён, чтобы лучше показать, что класс является перечислением, а элементы перечисления являются именно элементами перечисления, а не обычными константами класса.

Вывод метода ReflectionProperty::__toString() для свойств с хуками изменён, чтобы указать, у каких хуков есть свойство, являются ли эти хуки окончательными и является ли свойство виртуальным. Это также влияет на вывод метода ReflectionClass::__toString(), когда класс содержит свойства с хуками.

Функции Sockets

Функции socket_create()/socket_bind() могут создавать сокеты семейства AF_PACKET.

Функция socket_getsockname() получает индекс интерфейса и его строковое представление с помощью сокета AF_PACKET.

Функции Zlib

Параметр $use_include_path функций gzfile(), gzopen() и readgzfile() изменён с целого числа (int) на логическое значение (bool).

Функции gzfile(), gzopen() и readgzfile() теперь учитывают контекст потока по умолчанию.

Другие изменения в модулях

Модуль cURL

Функция curl_setopt() со значением опции CURLOPT_FOLLOWLOCATION больше рассматривается не как логическое значение, а как целое число для обработки CURLFOLLOW_OBEYCODE и CURLFOLLOW_FIRSTONLY.

Модуль Fileinfo

Обновлён файл с версии 5.45 до 5.46.

Тип возвращаемого значения функции finfo_close() был изменён на true вместо bool.

Модуль интернационализации

Внутренний механизм ошибок Intl был модернизирован, чтобы более точно указывать, какой участок кода вызвал ту или иную ошибку. Кроме того, некоторые исключения ext/date теперь заключены в IntlException.

Модуль Lexbor

Добавлен всегда включенный модуль lexbor. Он содержит библиотеку lexbor, которая была отделена от ext/dom для повторного использования в других модулях. Новый модуль не доступно напрямую пользователям.

Модуль PCRE

Обновлена библиотека pcre2lib с версии 10.44 до 10.46.

Модуль PDO_Sqlite

Увеличена поддержка минимальной версии с 3.7.7 до 3.7.17.

Модуль Readline

Функции readline_add_history(), readline_clear_history() и readline_callback_handler_install() теперь возвращают конкретный тип true вместо общего bool.

Модуль интроспекции кода Reflection

С класса ReflectionConstant сняли модификатор final.

Изменения обработки INI-файла

Ядро PHP

В файлы конфигурации добавили директиву fatal_error_backtraces. Директива определяет, требуется ли включать в сведения о критических ошибках обратную трассировку.

В INI-файлы добавили директиву max_memory_limit. Директива определяет границу, превышение которой при установке значения memory_limit спровоцирует предупреждение и установит директиве memory_limit текущее значение max_memory_limit, если только для max_memory_limit не установили значение -1, которое снимает ограничение. Значение новой директивы невозможно изменить после запуска PHP, тогда как значение memory_limit доступно для изменения и в конфигурации, и на этапе выполнения программы.

Модуль Opcache

Добавили директиву opcache.file_cache_read_only. Директива переводит работу с каталогом кеша второго уровня, на который указывает директива opcache.file_cache, в режим только для чтения. Директиву включают, например, для работы с Docker-контейнерами, внутри которых файловую систему смонтировали в режиме только для чтения. Для уменьшения количества дисковых операций и снижения нагрузки на ЦП при включении директивы также устанавливают следующие настройки: opcache.validate_timestamps=0, opcache.enable_file_override=1 и opcache.file_cache_consistency_checks=0.

Замечание:

Модуль проигнорирует кеш, который сгенерировала другая сборка PHP, по другому пути к файлу или с другими настройками, включая набор загруженных модулей.

Предустановленное значение директивы opcache.jit_hot_loop теперь равно простому числу 61; простое число с меньшей вероятностью окажется кратным количеству повторений цикла.

PHP теперь сообщит об ошибке, если значение директивы opcache.memory_consumption изменили после инициализации общей памяти модуля OPcache; раньше уведомление не выдавалось, а в информации о настройках PHP выводилось некорректное значение.

Модуль OpenSSL

Добавлена опция openssl.libctx для выбора типа контекста библиотеки OpenSSL. Можно использовать либо настраиваемый libctx для каждого потока, либо один глобальный (по умолчанию) libctx.

Производительность

Ядро PHP

Удалены OP-коды для сравнения идентичности с логическими значениями, в частности для шаблона match(true).

Добавлена специализация OPcode для сравнений === [] и !== [].

Создание объектов исключений теперь происходит намного быстрее.

Части кода, в которых использовался SSE2, были адаптированы для использования SIMD с ARM NEON.

Введена виртуальная машина TAILCALL, включенная по умолчанию при компиляции с Clang>=19 на x86_64 или aarch64. Виртуальная машина TAILCALL работает так же быстро, как виртуальная машина HYBRID, используемая при компиляции с GCC. Благодаря этому бинарные файлы PHP, скомпилированные с Clang>=19, работают так же быстро, как бинарные файлы, скомпилированные с GCC. Производительность виртуальной машины CALL, используемой с другими компиляторами, также значительно улучшилась.

Модуль интернационализации

Внутренняя функция перестала создавать лишние копии строк при перекодировании перед обработкой средством сопоставления.

Модуль MBString

Части кода, в которых использовался SSE2, были адаптированы для использования SIMD с ARM NEON.

Модуль Opcache

Улучшена производительность извлечения переменных TLS в коде JIT в сборках без Glibc.

Модуль интроспекции кода Reflection

Улучшена производительность следующих методов:

Модуль SPL

Улучшена производительность методов доступа к размерам и методов SplFixedArray.

Стандартные модули

Улучшенная производительность функций для работы с массивами с callback-функциями (array_find(), array_filter(), array_map(), usort(), ...).

Улучшена производительность функций urlencode() и rawurlencode().

Улучшена производительность функции unpack() с безымянными повторениями за счёт отказа от создания временных строк и их повторного анализа.

Улучшена производительность функции pack().

Незначительные улучшения производительности функции array_chunk().

Модуль XML

Улучшена производительность доступа к свойству класса XMLReader.

Улучшена производительность класса XMLWriter и уменьшено потребление памяти.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Core changes

Core

The high resolution timer (hrtime()) on macOS now uses the recommended clock_gettime_nsec_np(CLOCK_UPTIME_RAW) API instead of mach_absolute_time().

CGI/CLI

The -z or --zend-extension option has been removed as it was non-functional. Use -d zend_extension=[path] instead.

PDO_ODBC

The fetch behaviour for larger columns has been changed. Rather than fetching 256 byte blocks, PDO_ODBC will try to fetch a larger block size; currently, this is the page size minus string overhead. Drivers that return SQL_NO_TOTAL in SQLGetData are also better handled as well. This should improve compatibility and performance.

Changes in SAPI Modules

CLI

Trying to set a process title that is too long with cli_set_process_title() will now fail instead of silently truncating the given title.

Added a new --ini=diff option to print INI settings changed from the builtin default.

FPM

FPM with httpd ProxyPass optionally decodes the full script path. Added fastcgi.script_path_encoded INI setting to prevent this new behavior.

FPM access log limit now respects log_limit value.

Changed Functions

Intl

grapheme_extract() properly assigns next value when skipping over invalid starting bytes. Previously there were cases where it would point to the start of the grapheme boundary instead of the end.

transliterator_get_error_code(), transliterator_get_error_message(), TransLiterator::getErrorCode(), and TransLiterator::getErrorMessage() have dropped false from the return type union. Returning false was actually never possible.

The following functions now support a locale argument: grapheme_strpos(), grapheme_stripos(), grapheme_strrpos(), grapheme_strripos(), grapheme_substr(), grapheme_strstr() and grapheme_stristr()

LDAP

ldap_get_option() now accepts a null connection, like ldap_set_option(), to allow retrieval of global options.

libxml

libxml_set_external_entity_loader() now has a formal return type of true.

OpenSSL

openssl_public_encrypt() and openssl_private_decrypt() have a new parameter digest_algo that allows specifying the hash digest algorithm for OAEP padding.

openssl_sign() and openssl_verify() have a new parameter padding to allow using more secure RSA PSS padding.

openssl_cms_encrypt()cipher_algo parameter can be a string with the cipher name. That allows to use more algorithms including AES GCM cipher algorithms for auth enveloped data.

PCNTL

pcntl_exec() now has a formal return type of false.

pcntl_waitid() takes an additional resource_usage argument to gather various platform specific metrics about the child process.

PDO_PGSQL

Pdo\Pgsql::copyFromArray() now supports iterable inputs.

Pdo\Pgsql::setAttribute() and Pdo\Pgsql::prepare() support setting PDO::ATTR_PREFETCH to 0 which enters lazy fetch mode. In this mode, statements cannot be run in parallel.

PostgreSQL

pg_copy_from() now supports iterable inputs.

pg_connect() checks if the connection_string argument contains any null byte.

pg_close_stmt() checks if the statement_name argument contains any null byte.

POSIX

posix_ttyname() sets last_error to EBADF when encountering an invalid file descriptor.

posix_isatty() raises an E_WARNING message when encountering an invalid file descriptor.

posix_fpathconf() checks invalid file descriptors and sets last_error to EBADF and raises an E_WARNING message.

Reflection

The output of ReflectionClass::__toString() for enums has changed to better indicate that the class is an enum, and that the enum cases are enum cases rather than normal class constants.

The output of ReflectionProperty::__toString() for properties with hooks has changed to indicate what hooks the property has, whether those hooks are final, and whether the property is virtual. This also affects the output of ReflectionClass::__toString() when a class contains hooked properties.

Sockets

socket_create()/socket_bind() can create AF_PACKET family sockets.

socket_getsockname() gets the interface index and its string representation with AF_PACKET socket.

Zlib

The use_include_path argument for the gzfile(), gzopen() and readgzfile() functions has been changed from int to bool.

gzfile(), gzopen() and readgzfile() functions now respect the default stream context.

Other Changes to Extensions

cURL

curl_setopt() with CURLOPT_FOLLOWLOCATION option's value no longer is treated as boolean but integer to handle CURLFOLLOW_OBEYCODE and CURLFOLLOW_FIRSTONLY.

Fileinfo

Upgraded file from 5.45 to 5.46.

The return type of finfo_close() has been changed to true, rather than bool.

Intl

Intl's internal error mechanism has been modernized so that it indicates more accurately which call site caused what error. Moreover, some ext/date exceptions have been wrapped inside a IntlException now.

Lexbor

An always enabled lexbor extension is added. It contains the lexbor library that was separated from ext/dom for being reused among other extensions. The new extension is not directly exposed to userland.

PCRE

Upgraded pcre2lib from 10.44 to 10.46.

PDO_Sqlite

Increased minimum release version support from 3.7.7 to 3.7.17.

Readline

The return types of readline_add_history(), readline_clear_history(), and readline_callback_handler_install() have been changed to true, rather than bool.

Reflection

ReflectionConstant is no longer final.

Changes to INI File Handling

Core

Added fatal_error_backtraces to control whether fatal errors should include a backtrace.

Added startup-only max_memory_limit INI setting to control the maximum memory_limit that may be configured at startup or runtime. Exceeding this value emits a warning, unless set to -1, and sets memory_limit to the current max_memory_limit instead.

Opcache

Added opcache.file_cache_read_only to support a read-only opcache.file_cache directory, for use with read-only file systems (e.g. read-only Docker containers). Best used with opcache.validate_timestamps=0, opcache.enable_file_override=1, and opcache.file_cache_consistency_checks=0.

Note:

A cache generated with a different build of PHP, a different file path, or different settings (including which extensions are loaded), may be ignored.

The default value of opcache.jit_hot_loop is now 61 (a prime) to prevent it from being a multiple of loop iteration counts. It is recommended that this parameter is set to a prime number.

Changing opcache.memory_consumption when OPcache SHM is already set up will now correctly report a failure instead of silently doing nothing and showing misleading values in PHPInfo.

OpenSSL

Added openssl.libctx to select the OpenSSL library context type. Either custom libctx for each thread can be used or a single global (default) libctx is used.

Performance

Core

Remove OPcodes for identity comparisons against booleans, particularly for the match(true) pattern.

Add OPcode specialization for === [] and !== [] comparisons.

Creating exception objects is now much faster.

The parts of the code that used SSE2 have been adapted to use SIMD with ARM NEON as well.

Introduced the TAILCALL VM, enabled by default when compiling with Clang>=19 on x86_64 or aarch64. The TAILCALL VM is as fast as the HYBRID VM used when compiling with GCC. This makes PHP binaries built with Clang>=19 as fast as binaries built with GCC. The performance of the CALL VM, used with other compilers, has also improved considerably.

Intl

Now avoids creating extra string copies when converting strings for use in the collator.

MBString

The parts of the code that used SSE2 have been adapted to use SIMD with ARM NEON as well.

Opcache

Improved performance of fetching TLS variables in JIT'ed code in non-Glibc builds.

SPL

Improved performance of dimension accessors and methods of SplFixedArray.

Standard

Improved performance of array functions with callbacks (array_find(), array_filter(), array_map(), usort(), ...).

Improved performance of urlencode() and rawurlencode().

Improved unpack() performance with nameless repetitions by avoiding creating temporary strings and reparsing them.

Improved pack() performance.

Minor improvements in array_chunk() performance.

XML

Improved XMLReader property access performance.

Improved XMLWriter performance and reduced memory consumption.

PHP 8.4 → 8.5: Изменения поддержки Windows

Платформенные изменения проверяют в Windows-ветке CI: пути, кодировки, DLL, сигналы и сетевые детали нельзя надёжно подтвердить только Linux-тестом.

Полный официальный договор страницы

Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.

Ядро PHP

Конфигурационные переменные PHP_VERSION, PHP_MINOR_VERSION и PHP_RELEASE_VERSION теперь всегда являются числами. Ранее они были строками для сборок buildconf.

phpize теперь отражает исходное дерево в каталоге сборки (как это уже работало для сборок в дереве); некоторые сборки модулей (особенно при использовании Makefile.frag.w32) могут потребовать настройки.

Параметр конфигурации --enable-sanitizer теперь поддерживается для сборок MSVC. Она включает ASan и отладочные утверждения и поддерживается начиная с MSVC 16.10 и Windows 10.

Параметр конфигурации --with-uncritical-warn-choke для сборок clang больше не поддерживается. Вместо этого выберите предупреждения, которые необходимо подавлять, с помощью CFLAGS.

COM

Модуль теперь по умолчанию является разделяемым; ранее по умолчанию он был статическим, хотя официальные бинарные файлы Windows создавали общее расширение.

Модуль FFI

При использовании FFI::cdef() и FFI::load() больше не нужно указывать библиотеку. Однако эту удобную функцию не следует использовать в производственной среде.

Потоки

Если в массиве $read содержатся только потоки пайпов, а массивы $write и $except пусты, то функция stream_select() теперь ведёт себя аналогично системам POSIX, то есть функция возвращается только в том случае, если хотя бы один пайп готов к чтению или по истечении времени ожидания. Ранее функция stream_select() возвращалась немедленно, сообщая, что все потоки готовы к чтению.

Нормативный английский оригинал из frozen baseline

Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.

Core

The configuration variables PHP_VERSION, PHP_MINOR_VERSION, and PHP_RELEASE_VERSION are now always numbers. Previously, they have been strings for buildconf builds.

phpize builds now reflect the source tree in the build dir (as it already worked for in-tree builds); some extension builds (especially when using Makefile.frag.w32) may need adjustments.

--enable-sanitizer is now supported for MSVC builds. This enables ASan and debug assertions, and is supported as of MSVC 16.10 and Windows 10.

The --with-uncritical-warn-choke configuration option for clang builds is no longer supported. Select warnings to suppress via CFLAGS instead.

COM

The extension is now build shared by default; previously it defaulted to a static extension, although the official Windows binaries built a shared extension.

FFI

It is no longer necessary to specify the library when using FFI::cdef() and FFI::load(). However, this convenience feature should not be used in production.

Streams

If only pipe streams are contained in the read array, and the write and except arrays are empty, stream_select() now behaves similar to POSIX systems, i.e. the function only returns if at least one pipe is ready to be read, or after the timeout expires. Previously, stream_select() returned immediately, reporting all streams as ready to read.

Контроль перед переключением production

Все относящиеся к проекту несовместимости должны иметь воспроизводимый тест. Deprecation не подавляют: его устраняют или записывают владельца и срок. Новые функции применяют только после повышения минимальной версии. Затем повторяют smoke-тест в том же SAPI и на том же типе данных, что используется в production.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.