Добавлена поддержка именованных аргументов.
Добавлена поддержка атрибутов.
Добавлена поддержка определения свойств в конструкторе (объявление свойств в сигнатуре конструктора).
Добавлена поддержка объединения типов.
    Добавлена поддержка выражения 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.
