## 新機能

### PHP コア

#### 8進数の整数リテラルのプレフィックス指定

8進数の整数値の場合に、 数値リテラルのプレフィックスとして明示的に `0o` や `0O` を指定できるようになりました。 これは、2進数や16進数の整数リテラルの表記と似ています。

    <?php
    014;  // プレフィックス指定がない 8進数のリテラル
    0o14; // プレフィックスを指定した 8進数のリテラル
    ?>

#### 文字列をキーとして持つ配列のアンパック

文字列をキーとして持つ 配列をアンパック できるようになりました。

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

#### 引数を展開した後の名前付き引数

引数を ... で展開した後に、名前付き引数を指定できるようになりました。 e.g. foo(...$args, named: $arg).

#### ファイルアップロード時の full-path キーのサポート

ファイルアップロード時に、 追加で `full_path` キーを指定できるようになりました。 これにより、アップロードされるファイルの (basename ではなく) フルパスを指定できます。 これは、 "webkitdirectory" 属性 と組み合わせて使うことを意図しています。

#### 列挙型(Enum)

列挙型 のサポートが追加されました。

#### ファイバー(Fibers)

ファイバー のサポートが追加されました。

#### 第一級callableを生成する記法

`myFunc(...)` という記法 で、 callable から無名関数を生成できるようになりました。 これは、 `Closure::fromCallable('myFunc')` と同等です。

> 注意: `...` は文法の一部であり、省略形ではありません。

#### 交差型

交差型 のサポートが追加されました。

警告

交差型 は、 union 型 と一緒に使うことはできません。

#### Never 型

戻り値にのみ指定できる型として、 新しく never 型が追加されました。 これは、関数が exit() するか、 例外をスローするか、終了しないことを示します。

#### 初期化時の `new` 式の許可

`new ClassName()` 式が、パラメータのデフォルト値の初期化時、 static 変数の初期化時、グローバルな定数の初期化時、 およびアトリビュートの引数として許可されるようになりました。 オブジェクトが define() に渡せるようにもなっています。

#### 読み取り専用プロパティ

プロパティに対して、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`

ファイルをファイル経由ではなく、 文字列で POST するために使える CURLStringFile クラスが追加されました。

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

### FPM

OpenMetrics status フォーマットが追加されました。 これは、Prometheus が FPM のメトリクスを取得する用途に使います。

`pm.max_spawn_rate` と呼ばれる、 動的なプロセスマネージャーのための、 新しいプールオプションが追加されました。 これを指定することで、 動的なプロセスマネージャーを選択した場合に、 高速にたくさんの子プロセスが起動できるようになります。 これのデフォルト値は `32` で、 以前からハードコーディングされていたものです。

### GD

libgd に Avif のサポートが組み込まれている場合に、 imagecreatefromavif() と imageavif() で Avif が使えるようになりました。

### Hash

hash(), hash_file(), hash_init() 関数に、 オプションの引数 `options` が追加されました。 これによって、ハッシュアルゴリズム特有のデータを渡せるようになります。

#### MurmurHash3

ストリーミングをサポートした `MurmurHash3` のサポートが追加されました。 以下のバリアントが実装されています:

- murmur3a, 32-bit hash
- murmur3c, 128-bit hash for x86
- murmur3f, 128-bit hash for x64

ハッシュの初期ステートを 引数 `options` の `seed` キーを通じて渡すことができます。 たとえば、以下のように書くことができます:

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

有効な seed の値は `0` から プラットフォーム定義の `UINT_MAX` までです。 この値は、通常は `4294967295` です。

#### xxHash

`xxHash` のサポートが追加されました。 以下のバリアントが実装されています:

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

ハッシュの初期ステートを 引数 `options` の `seed` キーを通じて渡すことができます。 たとえば、以下のように書くことができます:

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

以下のようにして、シークレットを引数 `options` の `secret` キーを通じて渡すこともできます:

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

カスタムのシークレットの品質が、 生成されるハッシュ値の品質に重大な影響を及ぼします。 できる限りエントロピーが高いシークレットを使うことを強く推奨します。

### MySQLi

#### 新しい INI ディレクティブ `mysqli.local_infile_directory`

mysqlnd.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 から始まる整数値を指定することで、 どのカラムから情報を取得するかを指定できます。

    <?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"` のままです。

### Standard PHP Library(SPL)

SplFileObject::fputcsv() は、 新しい引数 `eol` を受け入れるようになりました。 これによって、カスタムの改行文字を定義できるようになります。 デフォルトは以前と同じで、`"\n"` のままです。

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