2025年11月20日、PHPの最新マイナーアップデートとなる PHP 8.5 がリリースされました。今回のアップデートでは、コードの可読性を劇的に高める パイプ演算子 の導入や、待望の 組み込みURI拡張、オブジェクトの不変性を支える Clone With など、モダンなWeb開発を強力にサポートする機能が多数追加されています。既存コードの改善から新規開発の安全性向上まで、全PHPエンジニアが注目すべき進化を遂げています。
概要と技術的背景
PHP 8.5は「よりスマートに、より速く、明日のために」を掲げ、開発者のコード記述量を減らしつつ、実行時の安全性を高めることに注力しています。
特に注目すべきは、これまで外部ライブラリに頼ることが多かったURL操作が URI拡張 として標準化された点です。uriparser(RFC 3986)およびLexbor(WHATWG URL)ライブラリをベースとしており、セキュアで標準に準拠したURL操作がデフォルトで可能になりました。また、関数型プログラミングのスタイルを取り入れた パイプ演算子(|>) は、ネストの深い関数呼び出しを直感的な「左から右への流れ」に書き換え、メンテナンス性を大きく向上させます。
詳細解説
今回のアップデートでは、言語仕様レベルでの強化が目立ちます。
- パイプ演算子(|>): 関数の戻り値を次の関数の第一引数(または第一引数相当)として渡す記法です。`$a = f(g(h($x)))` のような記述を `$x |> h(…) |> g(…) |> f(…)` と書けるようになり、処理の順序が明確になります。
- Clone With構文: `readonly` クラスなどで「一部のプロパティだけを変更して複製したい(Witherパターン)」場合に、`clone($obj, [‘prop’ => ‘value’])` という形式で簡潔に記述できるようになりました。
- #[\NoDiscard] 属性: 重要な戻り値を持つ関数に付与することで、戻り値が使用されていない場合に警告を発します。意図的に無視する場合は `(void)` キャストを使用します。
- 定数式でのクロージャと第一級コールバック: 静的クロージャや第一級コールバックが、属性の引数、プロパティのデフォルト値、定数などの「定数式」で使用可能になりました。
- 永続的cURLシェアハンドル: `curl_share_init_persistent()` により、リクエストを跨いでハンドルを保持できるようになり、接続初期化コストを削減します。
エンジニアパイプ演算子の導入で、文字列処理のメソッドチェーンが驚くほど綺麗に書けるようになりました。読みやすさは正義ですね。
アーキテクトURI拡張がRFCとWHATWGの両方に対応し、標準API化されたのは大きいです。cURLの永続ハンドル化と合わせて、外部通信の信頼性と速度が向上します。
実装・利用例
パイプ演算子による可読性の向上
// PHP 8.4 以前:ネストが深く、内側から読む必要がある
$slug = strtolower(str_replace('.', '', str_replace(' ', '-', trim(' PHP 8.5 '))));
// PHP 8.5:処理の流れが左から右へ一目でわかる
$slug = ' PHP 8.5 '
|> trim(...)
|> (fn($s) => str_replace(' ', '-', $s))
|> (fn($s) => str_replace('.', '', $s))
|> strtolower(...);
組み込みURI拡張の利用
use Uri\Rfc3986\Uri;
// 標準のAPIでセキュアにURLを解析
$uri = new Uri('https://php.net/releases/8.5/en.php');
var_dump($uri->getHost()); // string(7) "php.net"
Clone With によるプロパティ更新
readonly class Color {
public function __construct(public int $red, public int $green, public int $blue) {}
public function withRed(int $red): self {
// インスタンスを複製しつつ、特定のプロパティのみ上書き
return clone($this, ['red' => $red]);
}
}
#[\NoDiscard] 属性による安全性の確保
#[\NoDiscard]
function validate_token(): bool {
return false;
}
validate_token();
// Warning: The return value should either be used or intentionally ignored by casting it as (void)
array_first / array_last の追加
$events = ['first', 'second', 'last'];
// 専用関数で取得(空ならnullを返すため ?? 演算子と相性が良い)
$first = array_first($events);
$last = array_last($events);
その他の改善と変更点
主な新機能・改善
- 致命的エラーのバックトレース: 最大実行時間超過などのエラー時にバックトレースが含まれるようになりました。
- 属性の対象拡大: 定数に属性を付与可能になり、`#[\Override]` がプロパティに、`#[\Deprecated]` がトレイトと定数に使用可能になりました。
- 静的プロパティの非対称可視性: `public private(set) static` のような制御が可能になりました。
- Closure::getCurrent(): 匿名関数内での再帰処理を簡略化するメソッドが追加されました。
- CookieのPartitioned属性: `setcookie()` が “partitioned” キー(CHIPS)をサポートしました。
非推奨・互換性の変更
- バックティック演算子の非推奨: `shell_exec()` のエイリアスである “ `ls` “ 形式が非推奨となりました。
- 非正規のキャスト名の非推奨: `(boolean)`, `(integer)`, `(double)`, `(binary)` は非推奨です。`(bool)`, `(int)`, `(float)`, `(string)` を使用してください。
- INI設定の変更: `disable_classes` 設定が削除されました。
- 配列オフセットのnull: `array_key_exists()` 等で `null` をオフセットとして使用することが非推奨となりました(空文字を使用推奨)。
まとめ
- パイプ演算子とURI拡張 により、コードの可読性とURL操作の安全性が標準機能で担保されるようになった。
- Clone Withや#[\NoDiscard]属性 の導入で、イミュータブルな設計や堅牢なAPI構築がより容易になった。
- 永続的cURLシェアハンドル や、エラー時のバックトレースなど、運用・パフォーマンス面でも重要な進化を遂げている。
既存プロジェクトを PHP 8.5 へ移行する際は、バックティック演算子やキャスト名の変更などの非推奨事項を確認し、移行ガイドを参照することをお勧めします。