Новая функциональность
Ядро PHP
Именованные аргументы
Добавлена поддержка Именованных аргументов.
Атрибуты
Добавлена поддержка атрибутов.
Объявление свойств в конструкторе
Добавлена поддержка определения свойств в конструкторе (объявление свойств в сигнатуре конструктора).
Union Types
Добавлена поддержка union types.
Выражение Match
Добавлена поддержка выражения match
.
Оператор Nullsafe
Добавлена поддержка оператора Nullsafe (?->
).
Другие новые функции
-
Добавлен класс
WeakMap
. -
Добавлен класс ValueError.
-
Любое количество параметров функции теперь может быть заменено вариативным аргументом, при совместимости типов. Например, теперь следующий код является допустимым:
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?> -
static (как в "позднем статическом связывании") теперь можно использовать как возвращаемый тип:
<?php
class Test {
public function create(): static {
return new static();
}
}
?> -
Теперь можно получить имя класса объекта с помощью
$object::class
. Результат такой же, что иget_class($object)
. -
new
иinstanceof
теперь можно использовать с произвольными выражениями, используяnew (expression)(...$args)
и$obj instanceof (expression)
. -
Были внесены некоторые исправления согласованности в синтаксис переменных, например, теперь разрешена запись
Foo::BAR::$baz
. -
Добавлен интерфейс Stringable, который автоматически реализуется, если в классе определен метод __toString().
-
Теперь трейты могут определять абстрактные закрытые методы. Такие методы должны быть реализованы классом с помощью трейта.
-
throw
теперь можно использовать как выражение. Это означает, что теперь возможно следующее:<?php
$fn = fn() => throw new Exception('Исключение в стрелочной функции');
$user = $session->user ?? throw new Exception('Должен быть пользователь'); -
В списках параметров теперь разрешена необязательная завершающая запятая.
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- Эта запятая теперь разрешена.
) {
} -
Теперь можно написать
catch (Exception)
для перехвата исключения, не сохраняя его в переменной. -
Добавлена поддержка типа mixed.
-
Закрытые методы, объявленные в родительском классе, больше не применяют какие-либо правила наследования для методов дочернего класса (за исключением окончательных закрытых конструкторов). В следующем примере показано, какие ограничения были сняты:
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// Выдает предупреждение, так как "final" больше не имеет значения:
private final function method4() {}
}
class ChildClass extends ParentClass {
// Теперь все следующее разрешено, хотя модификаторы не такие же,
// как для закрытых методов в родительском классе.
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?> -
Добавлена функция get_resource_id(), которая возвращает то же значение, что и
(int) $resource
. Принцип работы такой же, но с более понятным API.
Дата и время
-
Были добавлены DateTime::createFromInterface() и DateTimeImmutable::createFromInterface().
-
Добавлен спецификатор формата DateTime
p
, который аналогиченP
, но возвращаетZ
, а не+00:00
для UTC.
DOM
Добавлены DOMParentNode и DOMChildNode с новыми API-интерфейсами обхода и управления.
Фильтрация данных
FILTER_VALIDATE_BOOL
был добавлен в качестве псевдонима для
FILTER_VALIDATE_BOOLEAN
. Новое имя является предпочтительным, так как оно использует
имя канонического типа.
Enchant
Добавлены enchant_dict_add(), enchant_dict_is_added() и
LIBENCHANT_VERSION
.
FPM
Добавлена новая опция pm.status_listen
, позволяющая получать статус
с другой конечной точки (например, порта или файла UDS). Это может пригодится для получения статуса, когда все
дочерние элементы заняты обработкой долговыполняемых запросов.
Hash
Теперь объекты HashContext можно сериализовать.
Функции интернационализации
Добавлены константы IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
и
IntlDateFormatter::RELATIVE_SHORT
.
LDAP
Добавлена функция ldap_count_references(), которая возвращает количество ссылочных сообщений в результатах поиска.
OPcache
Если ini-параметр opcache.record_warnings включен, OPcache будет записывать предупреждения во время компиляции и воспроизводить их при следующем включении, даже если они обслуживаются из кеша.
OpenSSL
Добавлена поддержка синтаксиса криптографических сообщений (CMS) (» RFC 5652),
состоящего из функций для шифрования, дешифрования, подписи, проверки и чтения. API
похож на API для функций PKCS #7 с добавлением новых констант кодирования:
OPENSSL_ENCODING_DER
, OPENSSL_ENCODING_SMIME
и OPENSSL_ENCODING_PEM
:
- openssl_cms_encrypt() шифрует сообщение в файле с сертификатами и выводит результат в предоставленный файл.
- openssl_cms_decrypt() расшифровывает сообщение S/MIME в файле и выводит результаты в предоставленный файл.
- openssl_cms_read() экспортирует файл CMS в массив сертификатов PEM.
- openssl_cms_sign() подписывает сообщение MIME в файле сертификатом и ключом и выводит результат в предоставленный файл.
- openssl_cms_verify() проверяет, что блок данных не поврежден, подписывающая сторона является тем, кем она являются и возвращает сертификаты подписывающих сторон.
Регулярные выражения (совместимые с Perl)
Добавлена функция preg_last_error_msg(), которая возвращает человекочитаемое сообщение о последней ошибке PCRE. Она дополняет preg_last_error(), которая возвращает целочисленное значение перечисления.
Reflection
-
Следующие методы теперь могут возвращать информацию о значениях параметров внутренних функций по умолчанию:
SQLite3
SQLite3::setAuthorizer() и соответствующие константы классов были добавлены, с помощью которых можно задать собственную callback-функцию для авторизации или запрета действия в базе данных.
Библиотека стандартных функций
-
Добавлены функции str_contains(), str_starts_with() и str_ends_with(), которые проверяют, содержит ли
haystack
, начинается или заканчиваетсяneedle
соответственно. -
Добавлена функция fdiv(), которая выполняет деление с плавающей запятой в соответствии с IEEE 754. Деление на ноль строго определено и возвращает одно из значений:
Inf
,-Inf
илиNaN
. -
Добавлена функция get_debug_type(), которая возвращает тип, который может использоваться для генераций сообщений об ошибках. В отличие от gettype(), она использует канонические имена типов, возвращает имена классов объектов и сообщает о типе ресурсов.
-
printf() и ее производные теперь поддерживают спецификаторы формата
%h
и%H
. Они работают как%g
и%G
, но всегда используют"."
в качестве десятичного разделителя, а не определяют его с помощью локалиLC_NUMERIC
. -
printf() и ее производные теперь поддерживают использование
"*"
в качестве ширины или точности, и в этом случае ширина/точность передается в качестве аргумента printf. Это также позволяет использовать точность-1
с%g
,%G
,%h
и%H
. Например, следующий код можно использовать для воспроизведения форматирования с плавающей запятой по умолчанию PHP:<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?> -
proc_open() теперь поддерживает дескрипторы псевдотерминала (PTY). Следующий код присоединяет
stdin
,stdout
иstderr
к одному и тому же PTY:<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?> -
proc_open() теперь поддерживает дескрипторы пары сокетов. Следующий код присоединяет отдельную пару сокетов к
stdin
,stdout
иstderr
:<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>В отличие от каналов, у сокетов нет проблем с блокировкой ввода-вывода в Windows. Однако не все программы могут корректно работать с сокетами stdio.
-
Функции сортировки теперь используют устойчивую сортировку, это означает, что сравниваемые элементы сохранят исходный порядок.
-
array_diff(), array_intersect() и их производные теперь могут использоваться с одним массивом в качестве аргумента. Это означает, что теперь возможно следующее:
<?php
// Работает, даже если $excludes пуст:
array_diff($array, ...$excludes);
// Работает, даже если $array содержит только один массив:
array_intersect(...$arrays);
?> -
Параметр
flag
в функции ob_implicit_flush() был изменен, и теперь принимает логическое значение (bool), а не целое число (int).
Лексер (Tokenizer)
PhpToken добавляет объектно-ориентированный интерфейс к PHP-лексеру (tokenizer). Он обеспечивает более единообразное и эргономичное представление, в то же время эффективнее и быстрее.
Zip
-
Модуль Zip обновлен до версии 1.19.1.
-
Новые методы ZipArchive::setMtimeName() и ZipArchive::setMtimeIndex() для установки времени изменения записи.
-
Новый метод ZipArchive::registerProgressCallback() для предоставления обновлений во время закрытия архива.
-
Новый метод ZipArchive::registerCancelCallback(), чтобы разрешить отмену во время закрытия архива.
-
Новый метод ZipArchive::replaceFile() для замены содержимого записи.
-
Новый метод ZipArchive::isCompressionMethodSupported(), чтобы проверить дополнительные возможности сжатия.
-
Новый метод ZipArchive::isEncryptionMethodSupported(), чтобы проверить дополнительные функции шифрования.
-
Добавлено свойство ZipArchive::lastId для получения значения индекса последней добавленной записи.
-
Теперь ошибки можно проверить после закрытия и с помощью свойств ZipArchive::status и ZipArchive::statusSys или метода ZipArchive::getStatusString().
-
Параметр
'remove_path'
в ZipArchive::addGlob() и ZipArchive::addPattern() теперь обрабатывается как произвольный строковый префикс (для согласованности с'add_path'
), тогда как раньше он интерпретировался как имя каталога. -
Дополнительные функции сжатия/шифрования теперь перечислены в phpinfo.