PHP 8.5の新機能
(stitcher.io)- PHP 8.5 は パイプ演算子、clone with、新しい URI パーサ など複数の機能を含むメジャーアップデート版
- パイプ演算子 は関数呼び出しチェーンを簡素化し、可読性と保守性を向上
- Clone with 機能はオブジェクト複製時にプロパティ値を同時に変更できるようにするが、一部の readonly プロパティ には制限あり
#[NoDiscard]、(void)キャスト、クロージャの定数式サポート、fatal error のバックトレース出力 など、開発者向け利便性を強化- 配列処理、プロパティ検証、非標準キャストの廃止 などの細かな改善と 下位互換性に関する変更 を含むバージョン
主な新機能
-
パイプ演算子 (
|>) の導入により、関数の結果を次の関数へ直接渡すチェーン型コードの記述が可能- ネストした関数呼び出しの代わりに、段階ごとにデータを変換する構造をサポート
- 例では
trim、str_replace、strtolowerなどを順番に接続
-
Clone with 機能により、オブジェクト複製時にプロパティ値を同時に変更可能
- 例のクラス
Bookではclone($this, ['title' => $title])の形で使用 - ただし、外部から readonly プロパティ を複製する場合は
public(set)アクセス指定が必要
- 例のクラス
-
#[NoDiscard]属性 と(void)キャスト を追加- 戻り値を無視した場合に警告を発生させる関数を示せる
(void)キャストを使うと警告を抑制可能
-
クロージャ改善 により、定数式内で クロージャおよび第一級 callable オブジェクト を使用可能
- 例では
#[SkipDiscovery(static function (...))]の形で属性内に定義 - これらのクロージャは必ず
staticとして宣言する必要があり、外部変数にはアクセス不可
- 例では
-
Fatal error のバックトレース出力 機能を追加
- 以前は表示されなかった スタックトレース情報 がエラーメッセージに含まれ、デバッグが容易に
配列および URI 関連機能
-
array_first()、array_last()関数を追加- 配列の最初と最後の要素を簡単に返却
- 従来の
array_key_first()とarray_key_last()を使う複雑なアクセス方法を置き換え
-
新しい URI パーサ を追加
Uri\Rfc3986\Uriクラスを通じてgetHost()、getScheme()、getPort()などのメソッドを提供- URI の操作と解析を簡素化
プロパティおよび検証関連機能
#[DelayedTargetValidation]属性 を導入#[Override]など一部属性の検証時点を コンパイル時から実行時へ遅延 可能- 下位互換性の問題を緩和することが目的
その他の小規模な変更点
- 静的プロパティの非対称可視性(asymmetric visibility) をサポート
- クラス外の定数にも属性(attribute) を付与可能
- コンストラクタプロパティ昇格(property promotion) が final プロパティ にも適用可能
#[\Override]属性 を プロパティにも適用 可能- Dom\Element::$outerHTML プロパティを追加
- Exif 拡張 が HEIF/HEIC 画像 をサポート
filter_var()呼び出し時にFILTER_THROW_ON_FAILUREフラグ を追加
廃止および非互換の変更
- 非標準キャスト名
(boolean)、(integer)などの使用を廃止 - バッククォート(```)を
shell_exec()のエイリアスとして使う方式 を廃止 - 定数の再宣言 機能を廃止
disabled_classesini 設定 を削除- 全変更および廃止項目の一覧は PHP 8.5 アップグレード文書 で確認可能
全体の要約
- PHP 8.5 は コード可読性、デバッグ、プロパティ処理、配列操作 など、全体的な開発体験を改善したバージョン
- パイプ演算子 と URI パーサ は実務コードの簡素化に直接影響
- 属性検証の遅延、新しい配列関数、バックトレース出力 などは保守性と安定性を高める変化
- 一部 非標準構文および設定の廃止 によりコード整備が必要
- 全体として 言語の一貫性強化と開発者の利便性向上 が中心のリリース
1件のコメント
Hacker Newsのコメント
私は今でもPHPが大好き
23年前にPHP向けの暗号化ソフトウェアを作ったが、今でもちゃんと動いている
今もPHPニュースレターを運営していて、依然として強いコミュニティがある
PythonやNode.jsも使うが、速くてシンプルな作業では結局PHPに戻ってくる
ただし、PHP 5以降で言語がずっと複雑になった点は諸刃の剣だと思う
Pythonが2から3へ移行する間に、PHPは5.2→5.3、5.6→7.0へと進化した
名前空間、PSR0オートローディング、パーサ改善などで速度と構造が大きく向上した
アップデートのたびに互換性を壊さず段階的に改善し、警告とshimを提供して旧バージョンの維持も可能だった
PHP 6が中止されたのは文字列処理の変更が理由だが、結果的に賢明な判断だったと思う
長いあいだ生計を支えてくれた言語とコミュニティを尊重するプロジェクトだった
複雑に書くこともできるが、そうする必要はない
2000年代半ばにZend関連ツールを扱ったが、かなり厄介だった記憶がある
PSRを身につけてセキュリティや機能を考慮すれば、ずっと安定して強力な言語になった
PHP 5以降の進化は印象的だが、そのぶん複雑さが増した問題もある
以前のバージョンで学んだ人にとっては、最新のコードベースは見慣れず追いかけにくい
これはコミュニティにとっては強みだが、復帰しようとする開発者には障壁になる
10年間C++を書いてきたが、今では最新のC++コードよりPHPのほうがずっと読みやすい
シンプルさという目標が失われ、機能だけが積み上がっていく感じだ
Web分野は特に変化が速いので、追いつかなければ取り残される
PHPは特に初心者が最初のWebサイトを作るときによく使う言語なので、他の言語より変化を大きく感じるのかもしれない
多くの人はPHPを恥ずかしいもののように扱う傾向があるが、私はそうではない
言語について詳しいわけではないが、優れたプロジェクトが多いことは知っている
最近いちばん気に入っているPHPプロジェクトはBookStackで、家族向けWikiとして使っている
きちんと管理されたPHPスタックで作られたサイトは今でもたくさんある
2021〜2023年に本番環境のPHPを使ったが、言語自体より問題だったのは古いコードベースと低い給与水準だった
PHP 4時代のレガシーコードが多く、データアクセスのパターンもばらばらで保守が大変だ
だがPHP 8へ移行する中で、コード品質は大きく向上した
新しいプロジェクトを始めるならPHPは選ばないが、モダンなLaravelプロジェクトなら喜んで参加する
ただ、初心者がセキュリティ概念なしに入りやすかったため、SQLインジェクションのような問題が多く、そのせいで「不安定な言語」という評判を得た
Laravelのようなフレームワークと一緒に使えば、ずっと安定して成熟した環境だ
ギター演奏や詩を書くことのように、誰でもできるが、上手くやるのは難しい仕事だ
実際にコードを見ながら学べるし、ラジオ/音楽サーバーをセルフホストする楽しさがある
PHPはアップデートされるほど複雑になっていく言語になった
依然としてWeb中心の言語なのに、なぜここまで発展するのか疑問だ
結局、伝統的なオブジェクト指向言語が似た方向へ収束しているように思う
Web専用の言語だとしても発展する理由は十分ある。開発者体験を改善するのは常に価値がある
array_first(), array_last()は便利だが、パイプ演算子は保守性を損なう可能性がある
単項関数しかサポートしないため、複雑な関数ではかえってバグを誘発しうる
PHP 8.5発表でいちばん興味深いのは、言語の安定性と成熟度だ
PHPがGTA6より先にarray_first、array_last、fatal error stack traceを追加するとは驚きだ
PHPに新しい関数や構文が追加され続けるのは、長期的に保守コストを高める
公式リリースノートを見ると、一部の機能は価値が曖昧だ
parse_url()と重複している公式PHP 8.5リリースノート
パイプ演算子の例は、ほとんどの言語で一時変数を使う一般的なやり方を省略したものだ
URL解析の例も
parse_url()と直接比較されていないparse_url()は標準に完全準拠しておらず、相対URLの扱いに弱い新しい
uri()関数はよりすっきりしており、部分適用機能が追加されればパイプチェーンはさらに読みやすくなるだろうPHP CLIで**バックティック(
)でshell_exec()を呼ぶ**ことがあったが、今ではdeprecatedになったmkdir $dirname`のような形でよく使っていたシェルのメタ文字注入リスクがあるので、PHPの
mkdir()やpcntl_exec()を使うべきだ