PHPのお勉強!

PHP TOP

新機能

PHP コア

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

8進数の整数値の場合に、 数値リテラルのプレフィックスとして明示的に 0o0O を指定できるようになりました。 これは、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 経由で扱うためのオプションが追加されました。

ファイルをファイル経由ではなく、 文字列で 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

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

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

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

<?php
$h
= hash("xxh3", $data, options: ["seed" => 42]);
echo
$h, "\n";
?>
以下のようにして、シークレットを引数 optionssecret キーを通じて渡すこともできます:
<?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')
?>