PHP 8.4.1 Released!

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

Ядро PHP

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

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

Атрибуты

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

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

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

Объединение типов

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

Выражение 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.

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

Дата и время

DOM

Добавлены DOMParentNode и DOMChildNode с новыми API-интерфейсами обхода и управления.

Фильтрация данных

FILTER_VALIDATE_BOOL был добавлен в качестве псевдонима для FILTER_VALIDATE_BOOLEAN. Новое имя является предпочтительным, так как оно использует имя канонического типа.

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.

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top