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

### Ядро PHP

#### Буквенный префикс восьмеричных целых чисел

Восьмеричные целые числа теперь могут использовать явный префикс `0o`/`0O` в целочисленных литералах, аналогично двоичным и шестнадцатеричным целочисленным литералам.

    <?php
    014;  // Восьмеричный литерал без префикса
    0o14; // Восьмеричный литерал с префиксом
    ?>

#### Распаковка массива с помощью строковых ключей

Добавлена поддержка распаковки массивов со строковыми ключами.

    <?php
    $arr1 = [1, 'a' => 'b'];
    $arr2 = [...$arr1, 'c' => 'd']; //[1, 'a' => 'b', 'c' => 'd']
    ?>

#### Именованный аргумент после распаковки аргумента

Теперь можно указать именованные аргументы после распаковки аргументов. например: foo(...$args, named: $arg).

#### Ключ с полным путём при загрузке файлов

При загрузке файлов появился новый ключ `full_path`, который содержит полный путь (а не только относительный) загруженного файла. Предназначен для использования вместе с HTML-атрибутом webkitdirectory.

#### Перечисления

Добавлена поддержка перечислений.

#### Файберы

Добавлена поддержка файберов.

#### Callback-функции как объекты первого класса

Замыкания для callback-функций теперь можно создавать с помощью синтаксиса `myFunc(...)`, который идентичен синтаксису `Closure::fromCallable('myFunc')`.

> Замечание: `...` является частью синтаксиса, а не пропуском.

#### Пересечение типов

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

Предостережение

Пересечения типов нельзя использовать вместе с объединением типов.

#### Тип never

Добавлен новый тип возвращаемого значения never. Тип указывает на то, что функция либо вызывает exit(), либо выбрасывает исключение, либо не завершается.

#### `new` в инициализации класса

Теперь можно использовать выражения `new ClassName()` в качестве значения по умолчанию для параметра, статической переменной, инициализаторов глобальных констант и в качестве аргументов атрибутов. Теперь объекты также можно передавать в define().

#### Readonly-свойства

Добавлена поддержка readonly-свойств.

#### Окончательные константы класса

Добавлена поддержка модификатора final при определении констант класса. Кроме того, константы интерфейса по умолчанию становятся переопределяемыми.

### CURL

Добавлена опция `CURLOPT_DOH_URL`.

Добавлены параметры для сертификата BLOB-объекта, доступные с libcurl >= 7.71.0:

- `CURLOPT_ISSUERCERT_BLOB`
- `CURLOPT_PROXY_ISSUERCERT`
- `CURLOPT_PROXY_ISSUERCERT_BLOB`
- `CURLOPT_PROXY_SSLCERT_BLOB`
- `CURLOPT_PROXY_SSLKEY_BLOB`
- `CURLOPT_SSLCERT_BLOB`
- `CURLOPT_SSLKEY_BLOB`

Добавлен класс CURLStringFile, который можно использовать для отправки файла из строки (string), а не из файла:

    <?php
    $file = new CURLStringFile($data, 'filename.txt', 'text/plain');
    curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => $file]);
    ?>

### FPM

Добавлен формат статуса openmetrics. Prometheus может использовать его для получения метрик FPM.

Добавлен новый пул для диспетчера динамических процессов под названием `pm.max_spawn_rate`. Он позволяет запускать несколько дочерних процессов более быстрыми темпами, если выбран динамический pm. Значение по умолчанию - `32`, которое ранее было фиксированным значением.

### GD

Поддержка Avif теперь доступна с помощью imagecreatefromavif() и imageavif(), если libgd был собран с поддержкой Avif.

### Hash

Следующие функции hash(), hash_file() и hash_init() теперь поддерживают дополнительный необязательный аргумент `options`, который можно использовать для передачи специфичных для алгоритма данных.

#### MurmurHash3

Добавлена поддержка `MurmurHash3` с поддержкой потоковой передачи. Реализованы следующие варианты:

- murmur3a, 32-битный хеш
- murmur3c, 128-битный хеш для x86
- murmur3f, 128-битный хеш для x64

Начальное состояние хеширования можно передать с помощью ключа `seed` в массиве `options`, например:

    <?php
    $h = hash("murmur3f", $data, options: ["seed" => 42]);
    echo $h, "\n";
    ?>

Допустимое начальное значение находится в диапазоне от `0` до определённого платформой значения `UINT_MAX`, обычно - `4294967295`.

#### xxHash

Добавлена поддержка `xxHash`. Реализованы следующие варианты:

- xxh32, 32-bit hash
- xxh64, 64-bit hash
- xxh3, 64-bit hash
- xxh128, 128-bit hash

Начальное состояние хеширования можно передать с помощью ключа `seed` в массиве `options`, например:

    <?php
    $h = hash("xxh3", $data, options: ["seed" => 42]);
    echo $h, "\n";
    ?>

Использование секрета также поддерживается путём передачи ключа `secret` в массиве `options`:

    <?php
    $h = hash("xxh3", $data, options: ["secret" => "как минимум 136 байт секрета"]);
    echo $h, "\n";
    ?>

Качество пользовательского секрета имеет решающее значение для качества хеша результата. Для секрета настоятельно рекомендуется использовать максимально возможную энтропию.

### MySQLi

#### Новая INI-директива `mysqli.local_infile_directory`

Добавлена INI-директива mysqli.local_infile_directory, с помощью которой можно указать каталог, из которого разрешена загрузка файлов. Это имеет смысл, только если mysqli.allow_local_infile не включён, поскольку в этом случае разрешены все каталоги.

#### Привязка параметров во время выполнении

Теперь можно привязывать параметры, передав их в виде массива в mysqli_stmt::execute(). Все значения будут привязаны как строки. Разрешены только списочные массивы. Эта новая функция недоступна, если MySQLi скомпилирован с libmysqlclient.

    <?php
    $stmt = $mysqli->prepare('INSERT INTO users(id, name) VALUES(?,?)');
    $stmt->execute([1, $username]);
    ?>

#### Новый метод mysqli_result::fetch_column()

Добавлен mysqli_result::fetch_column() для выборки единственного скалярного значения из набора результатов. Новый метод принимает необязательный параметр `column`, начинающийся с 0, в виде целого числа (int), указывающий из какого столбца производить выборку.

    <?php
    $result = $mysqli->query('SELECT username FROM users WHERE id = 123');
    echo $result->fetch_column();
    ?>

### PDO

Добавлен атрибут `PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY`, который можно использовать для указания каталога, из которого могут быть загружены файлы. Это имеет смысл только в том случае, если `PDO::MYSQL_ATTR_LOCAL_INFILE` не включён, поскольку в этом случае разрешены все каталоги.

### PDO_SQLite

Поддерживается новый элемент `"file:"` в DSN-префиксе SQLite, который позволяет указывать дополнительные флаги. Он не будет работать, если включена опция open_basedir.

    <?php
    new PDO('sqlite:file:path/to/sqlite.db?mode=ro')
    ?>

### POSIX

Добавлены константы `POSIX_RLIMIT_KQUEUES` и `POSIX_RLIMIT_NPTS`. Эти ограничения доступны только во FreeBSD.

### Стандартные функции

fputcsv() теперь принимает новый аргумент `eol`, который позволяет определять настраиваемую последовательность конца строки, значение по умолчанию остаётся прежним - `"\n"`.

### SPL

SplFileObject::fputcsv() теперь принимает новый аргумент `eol`, который позволяет определять настраиваемую последовательность конца строки, значение по умолчанию остаётся прежним - `"\n"`.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open