Добавили оператор конвейеризации |>.
<?php
$result = "Hello World" |> strlen(...);
print $result . PHP_EOL; // Prints "11"Добавили поддержку статических замыканий в константных выражениях. Константные выражения теперь поддерживают как стандартный синтаксис объявления анонимных функций, так и синтаксис с многоточием, которым создаются первоклассные вызываемые объекты Closure. Статические замыкания определяют при инициализации:
Добавили атрибут 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 теперь стала функцией и поддерживает переназначение доступных только для чтения свойств во время клонирования через новый параметр $withProperties.
Добавили поддержку общих дескрипторов, которые сохраняются между 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\Element::$outerHTML.
Добавили свойство $children в реализацию интерфейса Dom\ParentNode.
Добавили поддержку 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::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.
Варианты перечисления теперь выгружаются методом 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-идентификаторов и URL-адресов по правилам стандартов RFC 3986 и WHATWG.
Аргумент namespace в методах
XSLTProcessor::getParameter(),
XSLTProcessor::setParameter()
и XSLTProcessor::removeParameter() теперь обрабатывается корректно
и не игнорируется как пустой. Аргумент работает, только если параметр
name указали не в нотации Кларка или QName-имени,
поскольку при таком формате значения пространство имён извлекается из префикса
или атрибута href самого имени.
Функция flock() теперь поддерживает потоки zlib. Раньше попытки установить блокировку в таких потоках завершались ошибкой.