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

Дерево руководства
Глава 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, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.
- Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
- Прочитать несовместимости и deprecation именно для следующего шага.
- Поднять новую версию рядом, выполнить тесты и сравнить ответы.
- Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
- Новая функциональность
- Новые классы, перечисления и интерфейсы
- Новые функции
- Новые глобальные константы
- Изменения, которые ломают обратную совместимость
- Устаревшая функциональность
- Удалённые модули
- Другие изменения
- Подержка ОС Windows
Новая минорная версия приносит ряд новых функций и несовместимостей, которые требуется протестировать перед переключением версий 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
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
- New Features
- New Classes, Enums, and Interfaces
- New Functions
- New Global Constants
- Backward Incompatible Changes
- Deprecated Features
- Removed Extensions
- Other Changes
- Windows Support
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_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUT
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() и связанные с ним константы:
DOMNode::DOCUMENT_POSITION_DISCONNECTEDDOMNode::DOCUMENT_POSITION_PRECEDINGDOMNode::DOCUMENT_POSITION_FOLLOWINGDOMNode::DOCUMENT_POSITION_CONTAINSDOMNode::DOCUMENT_POSITION_CONTAINED_BYDOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Метод 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.
Модуль Reflection
Класс ReflectionAttribute теперь содержит свойство name, чтобы улучшить опыт отладки.
Методы ReflectionClassConstant::__toString() и ReflectionProperty::__toString() теперь возвращают комментарии, которые прикрепили к документу.
Добавили новые методы и константы ленивых объектов:
- ReflectionClass::newLazyGhost()
- ReflectionClass::newLazyProxy()
- ReflectionClass::resetAsLazyGhost()
- ReflectionClass::resetAsLazyProxy()
- ReflectionClass::isUninitializedLazyObject()
- ReflectionClass::initializeLazyObject()
- ReflectionClass::markLazyObjectAsInitialized()
- ReflectionClass::getLazyInitializer()
- ReflectionProperty::skipLazyInitialization()
- ReflectionProperty::setRawValueWithoutLazyInitialization()
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZEReflectionClass::SKIP_DESTRUCTOR
Модуль 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:
CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUT
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:
DOMNode::DOCUMENT_POSITION_DISCONNECTEDDOMNode::DOCUMENT_POSITION_PRECEDINGDOMNode::DOCUMENT_POSITION_FOLLOWINGDOMNode::DOCUMENT_POSITION_CONTAINSDOMNode::DOCUMENT_POSITION_CONTAINED_BYDOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
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.
Reflection
ReflectionAttribute now contains a name property to improve the debugging experience.
ReflectionClassConstant::__toString() and ReflectionProperty::__toString() now returns the attached doc comments.
Multiple new methods and constants which are related to the lazy objects feature have been added:
- ReflectionClass::newLazyGhost()
- ReflectionClass::newLazyProxy()
- ReflectionClass::resetAsLazyGhost()
- ReflectionClass::resetAsLazyProxy()
- ReflectionClass::isUninitializedLazyObject()
- ReflectionClass::initializeLazyObject()
- ReflectionClass::markLazyObjectAsInitialized()
- ReflectionClass::getLazyInitializer()
- ReflectionProperty::skipLazyInitialization()
- ReflectionProperty::setRawValueWithoutLazyInitialization()
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZEReflectionClass::SKIP_DESTRUCTOR
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
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. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Модуль BCMath
Модуль DBA
Модуль DOM
- Dom\HTMLDocument
- Dom\XMLDocument
- Dom\Document
- Dom\ParentNode
- Dom\ChildNode
- Dom\Implementation
- Dom\Node
- Dom\NodeList
- Dom\NamedNodeMap
- Dom\DtdNamedNodeMap
- Dom\HTMLCollection
- Dom\AdjacentPosition
- Dom\Element
- Dom\HTMLElement
- Dom\Attr
- Dom\CharacterData
- Dom\Text
- Dom\CDATASection
- Dom\ProcessingInstruction
- Dom\Comment
- Dom\DocumentType
- Dom\DocumentFragment
- Dom\Entity
- Dom\EntityReference
- Dom\Notation
- Dom\TokenList
- Dom\NamespaceInfo
- Dom\XPath
Модуль ODBC
Модуль PCNTL
- Pcntl\QosClass (только для ОС macOS)
Драйвер PDO_DBLIB
Драйвер PDO_FIREBIRD
Драйвер PDO_MYSQL
Драйвер PDO_ODBC
Драйвер PDO_PGSQL
Драйвер PDO_SQLITE
Модуль Reflection
Стандартные классы
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
BCMath
DOM
- Dom\HTMLDocument
- Dom\XMLDocument
- Dom\Document
- Dom\ParentNode
- Dom\ChildNode
- Dom\Implementation
- Dom\Node
- Dom\NodeList
- Dom\NamedNodeMap
- Dom\DtdNamedNodeMap
- Dom\HTMLCollection
- Dom\AdjacentPosition
- Dom\Element
- Dom\HTMLElement
- Dom\Attr
- Dom\CharacterData
- Dom\Text
- Dom\CDATASection
- Dom\ProcessingInstruction
- Dom\Comment
- Dom\DocumentType
- Dom\DocumentFragment
- Dom\Entity
- Dom\EntityReference
- Dom\Notation
- Dom\TokenList
- Dom\NamespaceInfo
- Dom\XPath
PCNTL
- Pcntl\QosClass (macOS only)
PDO_DBLIB
PDO_FIREBIRD
PDO_MYSQL
PDO_ODBC
PDO_PGSQL
PDO_SQLITE
Reflection
Standard
PHP 8.3 → 8.4: Новые функции и методы
Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Модуль BCMath
Модуль Date
Модуль Hash
Модуль Intl
Модуль MBString
Модуль Opcache
Модуль PCNTL
Модуль PDO_PGSQL
Модуль PGSQL
Модуль Reflection
Следующие методы относятся к новой функции ленивого объекта:
- ReflectionClass::newLazyGhost()
- ReflectionClass::newLazyProxy()
- ReflectionClass::resetAsLazyGhost()
- ReflectionClass::resetAsLazyProxy()
- ReflectionClass::isUninitializedLazyObject()
- ReflectionClass::initializeLazyObject()
- ReflectionClass::markLazyObjectAsInitialized()
- ReflectionClass::getLazyInitializer()
- ReflectionProperty::skipLazyInitialization()
- ReflectionProperty::setRawValueWithoutLazyInitialization()
Модуль Sodium
- sodium_crypto_aead_aegis128l_*
- sodium_crypto_aead_aegis256l_*
Модуль SPL
Модуль SOAP
Стандартные функции
Модуль XMLWriter
Модуль XSL
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
Date
Intl
Opcache
PCNTL
PDO_PGSQL
PGSQL
Reflection
The following methods relate to the new lazy object feature:
- ReflectionClass::newLazyGhost()
- ReflectionClass::newLazyProxy()
- ReflectionClass::resetAsLazyGhost()
- ReflectionClass::resetAsLazyProxy()
- ReflectionClass::isUninitializedLazyObject()
- ReflectionClass::initializeLazyObject()
- ReflectionClass::markLazyObjectAsInitialized()
- ReflectionClass::getLazyInitializer()
- ReflectionProperty::skipLazyInitialization()
- ReflectionProperty::setRawValueWithoutLazyInitialization()
Sodium
- sodium_crypto_aead_aegis128l_*
- sodium_crypto_aead_aegis256l_*
Standard
PHP 8.3 → 8.4: Новые глобальные константы
Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Модуль cURL
CURL_HTTP_VERSION_3CURL_HTTP_VERSION_3ONLYCURLOPT_TCP_KEEPCNTCURLOPT_PREREQFUNCTIONCURL_PREREQFUNC_OKCURL_PREREQFUNC_ABORTCURLOPT_SERVER_RESPONSE_TIMEOUTCURLOPT_DEBUGFUNCTIONCURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_POSTTRANSFER_TIME_T
Модуль Intl
PATTERN(IntlDateFormatter)PROPERTY_IDS_UNARY_OPERATOR(IntlChar)PROPERTY_ID_COMPAT_MATH_STARTPROPERTY_ID_COMPAT_MATH_CONTINUE
Модуль libxml
LIBXML_RECOVERLIBXML_NO_XXE. Константу указывают вместе с константойLIBXML_NOENT, когда требуется выполнить подстановку сущности и одновременно запретить загрузку внешней сущности. Константа доступна с libxml2 2.13.
Модуль MySQLi
Модуль OpenSSL
Модуль PCNTL
SIGCKPT(работает только в ОС DragonFlyBSD)SIGCKPTEXIT(работает только в ОС DragonFlyBSD)WEXITEDWSTOPPEDWNOWAITP_ALLP_PIDP_PGIDP_PIDFD(работает только в ОС Linux)P_UID(работает только в ОС NetBSD/FreeBSD)P_GID(работает только в ОС NetBSD/FreeBSD)P_SID(работает только в ОС NetBSD/FreeBSD)P_JAILID(работает только в ОС FreeBSD)
Драйвер PGSQL
Модуль POSIX
Модуль Sockets
Следующие параметры сокета получат определение, только если ОС поддерживает параметр:
SO_EXCLUSIVEADDRUSE(работает только в ОС Windows)SOCK_CONN_DGRAM(работает только в ОС NetBSD)SOCK_DCCP(работает только в ОС NetBSD)TCP_SYNCNT(работает только в ОС Linux)SO_EXCLBIND(работает только в ОС Solaris/Illumos)SO_NOSIGPIPE(работает только в ОС macOS и FreeBSD)SO_LINGER_SEC(работает только в ОС macOS)IP_PORTRANGE(работает только в ОС FreeBSD/NetBSD/OpenBSD)IP_PORTRANGE_DEFAULT(работает только в ОС FreeBSD/NetBSD/OpenBSD)IP_PORTRANGE_HIGH(работает только в ОС FreeBSD/NetBSD/OpenBSD)IP_PORTRANGE_LOW(работает только в ОС FreeBSD/NetBSD/OpenBSD)SOCK_NONBLOCKSOCK_CLOEXECSO_BINDTOIFINDEX
Модуль Sodium
Лексер (Tokenizer)
Модуль XML
-
Константа
XML_OPTION_PARSE_HUGEразрешает разбирать большой объем входных данных функциями xml_parse() и xml_parse_into_struct().
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
cURL
CURL_HTTP_VERSION_3CURL_HTTP_VERSION_3ONLYCURLOPT_TCP_KEEPCNTCURLOPT_PREREQFUNCTIONCURL_PREREQFUNC_OKCURL_PREREQFUNC_ABORTCURLOPT_SERVER_RESPONSE_TIMEOUTCURLOPT_DEBUGFUNCTIONCURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_POSTTRANSFER_TIME_T
Intl
PATTERN(IntlDateFormatter)PROPERTY_IDS_UNARY_OPERATOR(IntlChar)PROPERTY_ID_COMPAT_MATH_STARTPROPERTY_ID_COMPAT_MATH_CONTINUE
libxml
LIBXML_RECOVERLIBXML_NO_XXE. This is used together withLIBXML_NOENTwhen entity substitution should be performed, while disallowing external entity loading. This constant is available as of libxml2 2.13.
MySQLi
PCNTL
PGSQL
Sockets
The following socket options are now defined if they are supported:
SO_EXCLUSIVEADDRUSE(Windows only)SOCK_CONN_DGRAM(NetBSD only)SOCK_DCCP(NetBSD only)TCP_SYNCNT(Linux only)SO_EXCLBIND(Solaris/Illumos only)SO_NOSIGPIPE(macOS and FreeBSD)SO_LINGER_SEC(macOS only)IP_PORTRANGE(FreeBSD/NetBSD/OpenBSD only)IP_PORTRANGE_DEFAULT(FreeBSD/NetBSD/OpenBSD only)IP_PORTRANGE_HIGH(FreeBSD/NetBSD/OpenBSD only)IP_PORTRANGE_LOW(FreeBSD/NetBSD/OpenBSD only)SOCK_NONBLOCKSOCK_CLOEXECSO_BINDTOIFINDEX
Sodium
XML
XML_OPTION_PARSE_HUGEwhich allows parsing large inputs with xml_parse() and xml_parse_into_struct().
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 байтов. Общая длина по-прежнему зависит от платформы.
Типизация констант в классах модулей
Следующие модули теперь объявляют тип для констант своих классах:
Миграция ресурсов в объекты
Ряд ресурсов (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.
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:
- TypeError for invalid offset types
- ValueError for an empty string
- ValueError if the integer index does not fit in a signed 32 bit integer
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:
-
A ValueError if the
signalsarray is empty (except for pcntl_sigprocmask() if themodeSIG_SETMASK) -
A TypeError if a value of the
signalsarray is not an int -
A ValueError if a value of the
signalsarray is not a valid signal number
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
secondsis less than0 -
A ValueError if
nanosecondsis less than0or greater than1e9 -
A ValueError if both
secondsandnanosecondsare0
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(), смотря что уместнее.
Модуль 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.
Модуль 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) {}<?php
function foo(T1|null $a = null) {}<?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) {}<?php
function foo(T1 $a, T2|null $b, T3 $c) {}<?php
function foo(T1 $a, ?T2 $b, T3 $c) {}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.
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. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
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().
Добавили новые атрибуты, которые указывают уровень изоляции транзакции и режим доступа. Добавили пять констант, которые относятся к этой функциональности:
Pdo\Firebird::TRANSACTION_ISOLATION_LEVELPdo\Firebird::READ_COMMITTEDPdo\Firebird::REPEATABLE_READPdo\Firebird::SERIALIZABLEPdo\Firebird::WRITABLE_TRANSACTION
Конструкторе теперь проверяет работоспособность подключений при работе с постоянными соединениями.
Содержимое, которое создаёт драйвер, меняется в зависимости от значения флага
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:
Pdo\Firebird::TRANSACTION_ISOLATION_LEVELPdo\Firebird::READ_COMMITTEDPdo\Firebird::REPEATABLE_READPdo\Firebird::SERIALIZABLEPdo\Firebird::WRITABLE_TRANSACTION
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.
SPL
The SplPriorityQueue::insert(), SplPriorityQueue::recoverFromCorruption(), SplHeap::insert(), SplHeap::recoverFromCorruption() methods now have a tentative return type of true instead of bool.
SplObjectStorage now implements SeekableIterator.
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, расширений и зависимостей, затем включают полную диагностику и прогоняют тесты на копии данных.
- Зафиксировать рабочую версию, расширения, php.ini и внешние службы.
- Прочитать несовместимости и deprecation именно для следующего шага.
- Поднять новую версию рядом, выполнить тесты и сравнить ответы.
- Исправить код, повторить проверку, подготовить откат и только затем переключать трафик.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
- Новая функциональность
- Новые классы, перечисления и интерфейсы
- Новая функциональность
- Новые глобальные константы
- Изменения, которые ломают обратную совместимость
- Устаревшая функциональность
- Другие изменения
- Подержка ОС Windows
Эта новая минорная версия приносит с ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий 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
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
- New Features
- New Classes and Interfaces
- New Functions
- New Global Constants
- Backward Incompatible Changes
- Deprecated Features
- Other Changes
- Windows Support
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.
- Найти нужный пункт и определить: язык, ядро или отдельное расширение.
- Проверить минимальную версию PHP и внешней библиотеки, если она указана.
- Прочитать параметры, результат и исключения конкретного API, затем воспроизвести минимальный случай.
- Зафиксировать ограничение 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.
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.
PDO_Sqlite
Added class constant Pdo\Sqlite::ATTR_BUSY_STATEMENT.
Added class constants Pdo\Sqlite::ATTR_EXPLAIN_STATEMENT,
Pdo\Sqlite::EXPLAIN_MODE_PREPARED,
Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN,
Pdo\Sqlite::EXPLAIN_MODE_EXPLAIN_QUERY_PLAN.
Added Pdo\Sqlite::ATTR_TRANSACTION_MODE connection attribute
with possible values Pdo\Sqlite::TRANSACTION_MODE_DEFERRED,
Pdo\Sqlite::TRANSACTION_MODE_IMMEDIATE,
and Pdo\Sqlite::TRANSACTION_MODE_EXCLUSIVE,
allowing to configure the transaction mode to use when calling beginTransaction().
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
$length = 'order-42' |> strtoupper(...) |> strlen(...);
echo $length, "\n";
Ожидаемый результат
8
Оператор |> передаёт левое значение как единственный аргумент callable справа. Это пример только для PHP 8.5+; в библиотеке с поддержкой 8.4 такой файл даже не распарсится.
PHP 8.4 → 8.5: Новые классы, интерфейсы и перечисления
Новые классы, интерфейсы и enum доступны только в указанной ветке PHP или расширения. Перед условной интеграцией проверяют версию и наличие расширения; для обязательной зависимости ранний отказ понятнее тихой деградации.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Ядро PHP
Модуль cURL
Модуль фильтрации данных
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
PHP 8.4 → 8.5: Новые функции и методы
Каталог новых вызовов нужен при замене собственного вспомогательного кода встроенным API. Сначала проверяют версию появления, возвращаемый тип и отказ, затем удаляют полифилл только после обновления всех сред.
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Модуль DOM
- Dom\Element::getElementsByClassName()
- Dom\Element::insertAdjacentHTML()
Модуль Enchant
Модуль Opcache
Драйвер PDO_SQLITE
Драйвер PDO_PGSQL
- pg_close_stmt()
- pg_service()
Модуль Reflection
Модуль Sqlite
Стандартные модули
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
DOM
- Dom\Element::getElementsByClassName()
- Dom\Element::insertAdjacentHTML()
PDO_SQLITE
PGSQL
Reflection
Sqlite
Standard
PHP 8.4 → 8.5: Новые глобальные константы
Новые константы описывают возможности runtime и расширений. Их нельзя считать включёнными только по версии PHP: для расширений дополнительно проверяют загрузку модуля, а для необязательной ветки — defined().
Полный официальный договор страницы
Ниже сохранён официальный русский текст и структура из зафиксированного архива PHP Manual. Отдельные ещё не переведённые страницы официального русского архива могут оставаться на английском.
Ядро PHP
Модуль cURL
CURLINFO_USED_PROXYCURLINFO_HTTPAUTH_USEDCURLINFO_PROXYAUTH_USEDCURLINFO_CONN_IDCURLINFO_QUEUE_TIME_TCURLOPT_INFILESIZE_LARGECURLFOLLOW_ALLCURLFOLLOW_OBEYCODECURLFOLLOW_FIRSTONLY
Модуль Filter
Модуль Intl
DECIMAL_COMPACT_SHORTDECIMAL_COMPACT_LONG
Модуль OpenSSL
Модуль POSIX
POSIX_SC_OPEN_MAX
Модуль Sockets
IPPROTO_ICMPIPPROTO_ICMPV6TCP_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_RDSHUT_WRSHUT_RDWR
Модуль Tokenizer
Стандартные модули
IMAGETYPE_HEIFIMAGETYPE_SVG, если доступен модуль libxml.
Нормативный английский оригинал из frozen baseline
Этот слой сохраняет полный договор, если перевод отстаёт. Источник: английский нормативный оригинал.
cURL
Filter
Intl
DECIMAL_COMPACT_SHORTDECIMAL_COMPACT_LONG
POSIX
POSIX_SC_OPEN_MAX
Sockets
IPPROTO_ICMPIPPROTO_ICMPV6TCP_FUNCTION_BLK(FreeBSD only)TCP_FUNCTION_ALIAS(FreeBSD only)TCP_REUSPORT_LB_NUMA(FreeBSD only)TCP_REUSPORT_LB_NUMA_NODOM(FreeBSD only)TCP_REUSPORT_LB_NUMA_CURDOM(FreeBSD only)TCP_BBR_ALGORITHM(FreeBSD only)AF_PACKET(Linux only)IP_BINDANY(FreeBSD/NetBSD/OpenBSD only)SO_BUSY_POLL(Linux only)UDP_SEGMENT(Linux only)SHUT_RDSHUT_WRSHUT_RDWR
Tokenizer
Standard
IMAGETYPE_HEIFIMAGETYPE_SVGwhen libxml is loaded.
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 устарели. Список затронутых вызовов:
- ldap_connect() с поддержкой wallet
- ldap_connect_wallet()
GSLC_SSL_NO_UATHGSLC_SSL_ONEWAY_UATHGSLC_SSL_TWOWAY_UATH
Модуль MySQLi
Функция-псевдоним mysqli_execute() устарела. Вместо неё используйте функцию mysqli_stmt_execute().
Модуль OpenSSL
Параметр $key_length функции openssl_pkey_derive() устарел.
Это связано с тем, что он либо игнорируется, либо обрезает ключ,
что может представлять угрозу безопасности.
Модуль PDO
Схема DSN "uri:" объявлена устаревшей из-за проблем безопасности,
связанных с DSN, поступающими из удалённых URI.
Константы, специфичные для драйвера, в классе PDO объявлены устаревшими. Список затронутых констант и их замены:
PDO::DBLIB_ATTR_CONNECTION_TIMEOUT=>Pdo\Dblib::ATTR_CONNECTION_TIMEOUTPDO::DBLIB_ATTR_QUERY_TIMEOUT=>Pdo\Dblib::ATTR_QUERY_TIMEOUTPDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER=>Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIERPDO::DBLIB_ATTR_VERSION=>Pdo\Dblib::ATTR_VERSIONPDO::DBLIB_ATTR_TDS_VERSION=>Pdo\Dblib::ATTR_TDS_VERSIONPDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS=>Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETSPDO::DBLIB_ATTR_DATETIME_CONVERT=>Pdo\Dblib::ATTR_DATETIME_CONVERTPDO::FB_ATTR_DATE_FORMAT=>Pdo\Firebird::ATTR_DATE_FORMATPDO::FB_ATTR_TIME_FORMAT=>Pdo\Firebird::ATTR_TIME_FORMATPDO::FB_ATTR_TIMESTAMP_FORMAT=>Pdo\Firebird::ATTR_TIMESTAMP_FORMATPDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>Pdo\Mysql::ATTR_USE_BUFFERED_QUERYPDO::MYSQL_ATTR_LOCAL_INFILE=>Pdo\Mysql::ATTR_LOCAL_INFILEPDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY=>Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORYPDO::MYSQL_ATTR_INIT_COMMAND=>Pdo\Mysql::ATTR_INIT_COMMANDPDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>Pdo\Mysql::ATTR_MAX_BUFFER_SIZEPDO::MYSQL_ATTR_READ_DEFAULT_FILE=>Pdo\Mysql::ATTR_READ_DEFAULT_FILEPDO::MYSQL_ATTR_READ_DEFAULT_GROUP=>Pdo\Mysql::ATTR_READ_DEFAULT_GROUPPDO::MYSQL_ATTR_COMPRESS=>Pdo\Mysql::ATTR_COMPRESSPDO::MYSQL_ATTR_DIRECT_QUERY=>Pdo\Mysql::ATTR_DIRECT_QUERYPDO::MYSQL_ATTR_FOUND_ROWS=>Pdo\Mysql::ATTR_FOUND_ROWSPDO::MYSQL_ATTR_IGNORE_SPACE=>Pdo\Mysql::ATTR_IGNORE_SPACEPDO::MYSQL_ATTR_SSL_KEY=>Pdo\Mysql::ATTR_SSL_KEYPDO::MYSQL_ATTR_SSL_CERT=>Pdo\Mysql::ATTR_SSL_CERTPDO::MYSQL_ATTR_SSL_CA=>Pdo\Mysql::ATTR_SSL_CAPDO::MYSQL_ATTR_SSL_CAPATH=>Pdo\Mysql::ATTR_SSL_CAPATHPDO::MYSQL_ATTR_SSL_CIPHER=>Pdo\Mysql::ATTR_SSL_CIPHERPDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT=>Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERTPDO::MYSQL_ATTR_SERVER_PUBLIC_KEY=>Pdo\Mysql::ATTR_SERVER_PUBLIC_KEYPDO::MYSQL_ATTR_MULTI_STATEMENTS=>Pdo\Mysql::ATTR_MULTI_STATEMENTSPDO::ODBC_ATTR_USE_CURSOR_LIBRARY=>Pdo\Odbc::ATTR_USE_CURSOR_LIBRARYPDO::ODBC_ATTR_ASSUME_UTF8=>Pdo\Odbc::ATTR_ASSUME_UTF8PDO::ODBC_SQL_USE_IF_NEEDED=>Pdo\Odbc::SQL_USE_IF_NEEDEDPDO::ODBC_SQL_USE_DRIVER=>Pdo\Odbc::SQL_USE_DRIVERPDO::ODBC_SQL_USE_ODBC=>Pdo\Odbc::SQL_USE_ODBCPDO::PGSQL_ATTR_DISABLE_PREPARES=>Pdo\Pgsql::ATTR_DISABLE_PREPARESPDO::SQLITE_ATTR_EXTENDED_RESULT_CODES=>Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODESPDO::SQLITE_ATTR_OPEN_FLAGS=>Pdo\Sqlite::OPEN_FLAGSPDO::SQLITE_ATTR_READONLY_STATEMENT=>Pdo\Sqlite::ATTR_READONLY_STATEMENTPDO::SQLITE_DETERMINISTIC=>Pdo\Sqlite::DETERMINISTICPDO::SQLITE_OPEN_READONLY=>Pdo\Sqlite::OPEN_READONLYPDO::SQLITE_OPEN_READWRITE=>Pdo\Sqlite::OPEN_READWRITEPDO::SQLITE_OPEN_CREATE=>Pdo\Sqlite::OPEN_CREATE
Методы, специфичные для драйвера, в классе PDO объявлены устаревшими. Список затронутых методов и их замены:
- PDO::pgsqlCopyFromArray() => Pdo\Pgsql::copyFromArray()
- PDO::pgsqlCopyFromFile() => Pdo\Pgsql::copyFromFile()
- PDO::pgsqlCopyToArray() => Pdo\Pgsql::copyToArray()
- PDO::pgsqlCopyToFile() => Pdo\Pgsql::copyToFile()
- PDO::pgsqlGetNotify() => Pdo\Pgsql::getNotify()
- PDO::pgsqlGetPid() => Pdo\Pgsql::getPid()
- PDO::pgsqlLOBCreate() => Pdo\Pgsql::lobCreate()
- PDO::pgsqlLOBOpen() => Pdo\Pgsql::lobOpen()
- PDO::pgsqlLOBUnlink() => Pdo\Pgsql::lobUnlink()
- PDO::sqliteCreateAggregate() => Pdo\Sqlite::createAggregate()
- PDO::sqliteCreateCollation() => Pdo\Sqlite::createCollation()
- PDO::sqliteCreateFunction() => Pdo\Sqlite::createFunction()
Драйвер PDO_PGSQL
Константы, связанные с состояниями транзакций, объявлены устаревшими, поскольку функция недоступна в PDO:
PDO::PGSQL_TRANSACTION_IDLEPDO::PGSQL_TRANSACTION_ACTIVEPDO::PGSQL_TRANSACTION_INTRANSPDO::PGSQL_TRANSACTION_INERRORPDO::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:
- ldap_connect() with wallet support
- ldap_connect_wallet()
GSLC_SSL_NO_UATHGSLC_SSL_ONEWAY_UATHGSLC_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:
PDO::DBLIB_ATTR_CONNECTION_TIMEOUT=>Pdo\Dblib::ATTR_CONNECTION_TIMEOUTPDO::DBLIB_ATTR_QUERY_TIMEOUT=>Pdo\Dblib::ATTR_QUERY_TIMEOUTPDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER=>Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIERPDO::DBLIB_ATTR_VERSION=>Pdo\Dblib::ATTR_VERSIONPDO::DBLIB_ATTR_TDS_VERSION=>Pdo\Dblib::ATTR_TDS_VERSIONPDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS=>Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETSPDO::DBLIB_ATTR_DATETIME_CONVERT=>Pdo\Dblib::ATTR_DATETIME_CONVERTPDO::FB_ATTR_DATE_FORMAT=>Pdo\Firebird::ATTR_DATE_FORMATPDO::FB_ATTR_TIME_FORMAT=>Pdo\Firebird::ATTR_TIME_FORMATPDO::FB_ATTR_TIMESTAMP_FORMAT=>Pdo\Firebird::ATTR_TIMESTAMP_FORMATPDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>Pdo\Mysql::ATTR_USE_BUFFERED_QUERYPDO::MYSQL_ATTR_LOCAL_INFILE=>Pdo\Mysql::ATTR_LOCAL_INFILEPDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY=>Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORYPDO::MYSQL_ATTR_INIT_COMMAND=>Pdo\Mysql::ATTR_INIT_COMMANDPDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>Pdo\Mysql::ATTR_MAX_BUFFER_SIZEPDO::MYSQL_ATTR_READ_DEFAULT_FILE=>Pdo\Mysql::ATTR_READ_DEFAULT_FILEPDO::MYSQL_ATTR_READ_DEFAULT_GROUP=>Pdo\Mysql::ATTR_READ_DEFAULT_GROUPPDO::MYSQL_ATTR_COMPRESS=>Pdo\Mysql::ATTR_COMPRESSPDO::MYSQL_ATTR_DIRECT_QUERY=>Pdo\Mysql::ATTR_DIRECT_QUERYPDO::MYSQL_ATTR_FOUND_ROWS=>Pdo\Mysql::ATTR_FOUND_ROWSPDO::MYSQL_ATTR_IGNORE_SPACE=>Pdo\Mysql::ATTR_IGNORE_SPACEPDO::MYSQL_ATTR_SSL_KEY=>Pdo\Mysql::ATTR_SSL_KEYPDO::MYSQL_ATTR_SSL_CERT=>Pdo\Mysql::ATTR_SSL_CERTPDO::MYSQL_ATTR_SSL_CA=>Pdo\Mysql::ATTR_SSL_CAPDO::MYSQL_ATTR_SSL_CAPATH=>Pdo\Mysql::ATTR_SSL_CAPATHPDO::MYSQL_ATTR_SSL_CIPHER=>Pdo\Mysql::ATTR_SSL_CIPHERPDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT=>Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERTPDO::MYSQL_ATTR_SERVER_PUBLIC_KEY=>Pdo\Mysql::ATTR_SERVER_PUBLIC_KEYPDO::MYSQL_ATTR_MULTI_STATEMENTS=>Pdo\Mysql::ATTR_MULTI_STATEMENTSPDO::ODBC_ATTR_USE_CURSOR_LIBRARY=>Pdo\Odbc::ATTR_USE_CURSOR_LIBRARYPDO::ODBC_ATTR_ASSUME_UTF8=>Pdo\Odbc::ATTR_ASSUME_UTF8PDO::ODBC_SQL_USE_IF_NEEDED=>Pdo\Odbc::SQL_USE_IF_NEEDEDPDO::ODBC_SQL_USE_DRIVER=>Pdo\Odbc::SQL_USE_DRIVERPDO::ODBC_SQL_USE_ODBC=>Pdo\Odbc::SQL_USE_ODBCPDO::PGSQL_ATTR_DISABLE_PREPARES=>Pdo\Pgsql::ATTR_DISABLE_PREPARESPDO::SQLITE_ATTR_EXTENDED_RESULT_CODES=>Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODESPDO::SQLITE_ATTR_OPEN_FLAGS=>Pdo\Sqlite::ATTR_OPEN_FLAGSPDO::SQLITE_ATTR_READONLY_STATEMENT=>Pdo\Sqlite::ATTR_READONLY_STATEMENTPDO::SQLITE_DETERMINISTIC=>Pdo\Sqlite::DETERMINISTICPDO::SQLITE_OPEN_READONLY=>Pdo\Sqlite::OPEN_READONLYPDO::SQLITE_OPEN_READWRITE=>Pdo\Sqlite::OPEN_READWRITEPDO::SQLITE_OPEN_CREATE=>Pdo\Sqlite::OPEN_CREATE
Driver specific methods in the PDO class have been deprecated. List of affected methods and their replacement:
- PDO::pgsqlCopyFromArray() => Pdo\Pgsql::copyFromArray()
- PDO::pgsqlCopyFromFile() => Pdo\Pgsql::copyFromFile()
- PDO::pgsqlCopyToArray() => Pdo\Pgsql::copyToArray()
- PDO::pgsqlCopyToFile() => Pdo\Pgsql::copyToFile()
- PDO::pgsqlGetNotify() => Pdo\Pgsql::getNotify()
- PDO::pgsqlGetPid() => Pdo\Pgsql::getPid()
- PDO::pgsqlLOBCreate() => Pdo\Pgsql::lobCreate()
- PDO::pgsqlLOBOpen() => Pdo\Pgsql::lobOpen()
- PDO::pgsqlLOBUnlink() => Pdo\Pgsql::lobUnlink()
- PDO::sqliteCreateAggregate() => Pdo\Sqlite::createAggregate()
- PDO::sqliteCreateCollation() => Pdo\Sqlite::createCollation()
- PDO::sqliteCreateFunction() => Pdo\Sqlite::createFunction()
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().
Нормативный английский оригинал из 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.
Reflection
Improved performance of the following methods:
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.
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.
Источники и обсуждения
- PHP Manual: Migrating from PHP 8.3.x to PHP 8.4.x
- PHP Manual: New Features
- PHP Manual: New Classes, Enums, and Interfaces
- PHP Manual: New Functions
- PHP Manual: New Global Constants
- PHP Manual: Backward Incompatible Changes
- PHP Manual: Deprecated Features
- PHP Manual: Removed Extensions
- PHP Manual: Other Changes
- PHP Manual: Windows Support
- PHP Manual: Migrating from PHP 8.4.x to PHP 8.5.x
- PHP Manual: New Features
- PHP Manual: New Classes and Interfaces
- PHP Manual: New Functions
- PHP Manual: New Global Constants
- PHP Manual: Backward Incompatible Changes
- PHP Manual: Deprecated Features
- PHP Manual: Other Changes
- PHP Manual: Windows Support
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


