Добавлена поддержка именованных аргументов.
Добавлена поддержка атрибутов.
Добавлена поддержка определения свойств в конструкторе (объявление свойств в сигнатуре конструктора).
Добавлена поддержка объединения типов.
Добавлена поддержка выражения match
.
Добавлена поддержка оператора 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.
Добавлен класс InternalIterator.
Были добавлены DateTime::createFromInterface() и DateTimeImmutable::createFromInterface().
Добавлен спецификатор формата DateTime p
, который аналогичен
P
, но возвращает Z
, а не +00:00
для UTC.
Добавлены DOMParentNode и DOMChildNode с новыми API-интерфейсами обхода и управления.
FILTER_VALIDATE_BOOL
был добавлен в качестве псевдонима для
FILTER_VALIDATE_BOOLEAN
. Новое имя является предпочтительным, так как оно использует
имя канонического типа.
Добавлены enchant_dict_add(), enchant_dict_is_added() и
LIBENCHANT_VERSION
.
Добавлена новая опция pm.status_listen
, позволяющая получать статус
с другой конечной точки (например, порта или файла UDS). Это может пригодится для получения статуса, когда все
дочерние элементы заняты обработкой долговыполняемых запросов.
Теперь объекты HashContext можно сериализовать.
Добавлены константы IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
и
IntlDateFormatter::RELATIVE_SHORT
.
Добавлена функция ldap_count_references(), которая возвращает количество ссылочных сообщений в результатах поиска.
Если ini-параметр opcache.record_warnings включён, OPcache будет записывать предупреждения во время компиляции и воспроизводить их при следующем включении, даже если они обслуживаются из кеша.
Добавлена поддержка синтаксиса криптографических сообщений (CMS) (» RFC 5652),
состоящего из функций для шифрования, дешифрования, подписи, проверки и чтения. API
похож на API для функций PKCS #7 с добавлением новых констант кодирования:
OPENSSL_ENCODING_DER
, OPENSSL_ENCODING_SMIME
и OPENSSL_ENCODING_PEM
:
Добавлена функция preg_last_error_msg(), которая возвращает человекочитаемое сообщение о последней ошибке PCRE. Она дополняет preg_last_error(), которая возвращает целочисленное значение перечисления.
Следующие методы теперь могут возвращать информацию о значениях параметров внутренних функций по умолчанию:
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).
PhpToken добавляет объектно-ориентированный интерфейс к PHP-лексеру (tokenizer). Он обеспечивает более единообразное и эргономичное представление, в то же время эффективнее и быстрее.
Модуль 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.