Новая функциональность

Ядро PHP

Именованные аргументы

Добавлена поддержка Именованных аргументов.

Атрибуты

Добавлена поддержка атрибутов.

Объявление свойств в конструкторе

Добавлена поддержка определения свойств в конструкторе (объявление свойств в сигнатуре конструктора).

Union Types

Добавлена поддержка union types.

Выражение Match

Добавлена поддержка выражения match.

Оператор Nullsafe

Добавлена поддержка оператора Nullsafe (?->).

Другие новые функции

  • Добавлен класс WeakMap.

  • Добавлен класс ValueError.

  • Любое количество параметров функции теперь может быть заменено вариативным аргументом, при совместимости типов. Например, теперь следующий код является допустимым:

    <?php
    class {
         public function 
    method(int $manystring $parameters$here) {}
    }
    class 
    extends {
         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.

Дата и время

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.