## 新特性

### 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 键

现在文件上传新增了额外的 `full_path` 键，这包含了上传文件的完整路径（不仅仅是返回路径中的文件名部分）。这是为了与 “upload webkitdirectory” 结合使用。

#### 枚举

新增枚举支持。

#### 纤程

新增功能详见 Fibers。

#### First Class 可调用语法

现在可调用闭包可以使用 `myFunc(...)` 语法创建，与 `Closure::fromCallable('myFunc')`效果一样。

> 注意: `...` 是语法的一部分，不是省略。

#### 交集类型

新增功能详见交集类型。

警告

交集类型不能与联合类型 一起使用。

#### Never 类型

新增新的唯一返回类型 never。它表示函数要么 exit() ，要么抛出异常，要么不会终止。

#### 在初始化中 `new`

现在可以将 `new ClassName()` 语句作为参数、静态变量、初始化全局常量、注解参数的默认值。现在对象可以作为 define() 的参数了。

#### Readonly 属性

详见 readonly。

#### final 类常量

详见 final 常量修饰符。而且，接口常量默认可覆盖。

### CURL

新增 `CURLOPT_DOH_URL` 选项。

libcurl 版本 >= 7.71.0 时增加 blob 证书选项：

- `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 类，它能够直接将字符串（不是文件）作为文件上传。

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

### FPM

新增 openmetrics 数据格式。Prometheus 可以用它来获取 FPM 的监测指标。

动态进程管理模式下，新增 `pm.max_spawn_rate` 设置。该设置在动态模式下会更快生成初始数量的子进程。默认值为 `32` ，这在以前是硬编码值。

### GD

如果在编译安装 libgd 时添加 AVIF 依赖包，现在通过 imagecreatefromavif() 和 imageavif() 函数可获得 AVIF 图片格式，

### Hash

现在，下列函数 hash()、hash_file() 和 hash_init() 新增一个额外的 `options` 参数，该参数作为特定数据传递给函数算法。

#### MurmurHash3

新增对 `MurmurHash3`（支持流）的支持。有以下形式提供：

- murmur3a，32 位散列
- murmur3c，x86 的 128 位散列
- murmur3f，x64 的 128 位散列

hash 初始状态可以通过键为 `seed` 的 `options` 数组传递，例如：

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

seed 的有效值范围为 `0` 到系统定义的 `UINT_MAX`，通常是 `4294967295`。

#### xxHash

增加 `xxHash` 的支持。有以下形式提供：

- xxh32，32 位散列
- xxh64，64 位散列
- xxh3，64 位散列
- xxh128，128 位散列

hash 初始状态可以通过键为 `seed` 的 `options` 数组传递，例如：

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

使用秘钥可以通过键为 `secret` 的 `options` 数组传递，例如：

    <?php
    $h = hash("xxh3", $data, options: ["secret" => "at least 136 bytes long secret here"]);
    echo $h, "\n";
    ?>

自定义秘钥的质量对生成的散列质量至关重要。强烈建议秘钥尽可能使用最高标准的熵。

### MySQLi

#### 新增 INI 设置 `mysqli.local_infile_directory`

新增 mysqli.local_infile_directory INI 设置，该设置可以指定允许加载文件的目录。这个设置只在禁用 mysqli.allow_local_infile 时才有意义，这种情况下允许加载任意的文件目录。

#### execute 可绑定参数

现在可以将参数以数组的形式传递给 mysqli_stmt::execute() 来绑定参数。所有值都以字符串的形式绑定。仅支持普通数组。当使用 libmysqlclient 编译 MySQLi 时，这个新功能不可使用。

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

#### 新方法 mysqli_result::fetch_column()

新增 mysqli_result::fetch_column() 方法可以从结果集中获取单个标量值。新方法接收 int 类型、从 0 开始，可选的 `column` 参数，用于从指定行获取数据。

    <?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

现在已支持 SQLite 的 `"file:"` DSN 语法。可用于指定额外的标志。该功能在已设置 open_basedir 的情况下不能使用。

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

### POSIX

新增 `POSIX_RLIMIT_KQUEUES` 和 `POSIX_RLIMIT_NPTS`。这些 rlimits 只在 FreeBSD 可用。

### 标准

现在 fputcsv() 新增参数 `eol`，这个参数允许自定义数据的行尾值，默认值是 `"\n"`。

### PHP 标准库（SPL）

现在 SplFileObject::fputcsv() 新增参数 `eol`，这个参数允许自定义数据的结束位置，默认值保持不变，还是 `"\n"`。

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