2 ポイント 投稿者 GN⁺ 2025-11-21 | 1件のコメント | WhatsAppで共有
  • PHP 8.5 は パイプ演算子clone with新しい URI パーサ など複数の機能を含むメジャーアップデート版
  • パイプ演算子 は関数呼び出しチェーンを簡素化し、可読性と保守性を向上
  • Clone with 機能はオブジェクト複製時にプロパティ値を同時に変更できるようにするが、一部の readonly プロパティ には制限あり
  • #[NoDiscard](void) キャストクロージャの定数式サポートfatal error のバックトレース出力 など、開発者向け利便性を強化
  • 配列処理、プロパティ検証、非標準キャストの廃止 などの細かな改善と 下位互換性に関する変更 を含むバージョン

主な新機能

  • パイプ演算子 (|>) の導入により、関数の結果を次の関数へ直接渡すチェーン型コードの記述が可能

    • ネストした関数呼び出しの代わりに、段階ごとにデータを変換する構造をサポート
    • 例では trimstr_replacestrtolower などを順番に接続
  • 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_classes ini 設定 を削除
  • 全変更および廃止項目の一覧は PHP 8.5 アップグレード文書 で確認可能

全体の要約

  • PHP 8.5 は コード可読性、デバッグ、プロパティ処理、配列操作 など、全体的な開発体験を改善したバージョン
  • パイプ演算子URI パーサ は実務コードの簡素化に直接影響
  • 属性検証の遅延新しい配列関数バックトレース出力 などは保守性と安定性を高める変化
  • 一部 非標準構文および設定の廃止 によりコード整備が必要
  • 全体として 言語の一貫性強化と開発者の利便性向上 が中心のリリース

1件のコメント

 
GN⁺ 2025-11-21
Hacker Newsのコメント
  • 私は今でもPHPが大好き
    23年前にPHP向けの暗号化ソフトウェアを作ったが、今でもちゃんと動いている
    今もPHPニュースレターを運営していて、依然として強いコミュニティがある
    PythonやNode.jsも使うが、速くてシンプルな作業では結局PHPに戻ってくる
    ただし、PHP 5以降で言語がずっと複雑になった点は諸刃の剣だと思う

    • PHPは大規模な移行を正しくやり遂げた代表例だと思う
      Pythonが2から3へ移行する間に、PHPは5.2→5.3、5.6→7.0へと進化した
      名前空間、PSR0オートローディング、パーサ改善などで速度と構造が大きく向上した
      アップデートのたびに互換性を壊さず段階的に改善し、警告とshimを提供して旧バージョンの維持も可能だった
      PHP 6が中止されたのは文字列処理の変更が理由だが、結果的に賢明な判断だったと思う
      長いあいだ生計を支えてくれた言語とコミュニティを尊重するプロジェクトだった
    • PHPが複雑になったと言われることは多いが、私は5.3で書いたシンプルなコードがPHP 8でも完全に動いている
      複雑に書くこともできるが、そうする必要はない
    • その暗号化ソフトウェアはZendだったのか気になる
      2000年代半ばにZend関連ツールを扱ったが、かなり厄介だった記憶がある
    • PHP 8は最初から正しい方法で学べば十分理解しやすい
      PSRを身につけてセキュリティや機能を考慮すれば、ずっと安定して強力な言語になった
  • PHP 5以降の進化は印象的だが、そのぶん複雑さが増した問題もある
    以前のバージョンで学んだ人にとっては、最新のコードベースは見慣れず追いかけにくい
    これはコミュニティにとっては強みだが、復帰しようとする開発者には障壁になる

    • 最新のPHPは今でも可読性の高い言語だと思う
      10年間C++を書いてきたが、今では最新のC++コードよりPHPのほうがずっと読みやすい
    • PHP 8を学べば十分。今のPHPは昔よりはるかに良くなった
    • 最近のたいていのソフトウェアが似たような問題を抱えている
      シンプルさという目標が失われ、機能だけが積み上がっていく感じだ
    • 実際こうした変化は他の言語でも同じだ
      Web分野は特に変化が速いので、追いつかなければ取り残される
    • Javaの専門家として働いていても、新機能を同僚に説明しなければならないことが多い
      PHPは特に初心者が最初のWebサイトを作るときによく使う言語なので、他の言語より変化を大きく感じるのかもしれない
  • 多くの人はPHPを恥ずかしいもののように扱う傾向があるが、私はそうではない
    言語について詳しいわけではないが、優れたプロジェクトが多いことは知っている
    最近いちばん気に入っているPHPプロジェクトはBookStackで、家族向けWikiとして使っている
    きちんと管理されたPHPスタックで作られたサイトは今でもたくさんある

    • 現代のPHPは高速で素晴らしい言語
      2021〜2023年に本番環境のPHPを使ったが、言語自体より問題だったのは古いコードベース低い給与水準だった
      PHP 4時代のレガシーコードが多く、データアクセスのパターンもばらばらで保守が大変だ
      だがPHP 8へ移行する中で、コード品質は大きく向上した
      新しいプロジェクトを始めるならPHPは選ばないが、モダンなLaravelプロジェクトなら喜んで参加する
    • PHPは扱いが直感的で楽しい言語だった
      ただ、初心者がセキュリティ概念なしに入りやすかったため、SQLインジェクションのような問題が多く、そのせいで「不安定な言語」という評判を得た
    • JS/TS + 最新フレームワークよりPHPバックエンドのほうを好む
      Laravelのようなフレームワークと一緒に使えば、ずっと安定して成熟した環境
    • PHPでキャリアを築いてきて、今でもそのモダナイゼーションの過程を楽しんでいる
      ギター演奏や詩を書くことのように、誰でもできるが、上手くやるのは難しい仕事だ
    • AzuraCastが好き
      実際にコードを見ながら学べるし、ラジオ/音楽サーバーをセルフホストする楽しさがある
  • PHPはアップデートされるほど複雑になっていく言語になった
    依然としてWeb中心の言語なのに、なぜここまで発展するのか疑問だ

    • C#やJavaもWebバックエンド中心なので複雑になった
      結局、伝統的なオブジェクト指向言語が似た方向へ収束しているように思う
    • Web自体がだんだんシンプルではなくなっている
    • NativePhpのようなプロジェクトもある
      Web専用の言語だとしても発展する理由は十分ある。開発者体験を改善するのは常に価値がある
    • 最初は記事を読まずに批判していたが、見直してみると一部の機能は悪くない
      array_first(), array_last()は便利だが、パイプ演算子は保守性を損なう可能性がある
      単項関数しかサポートしないため、複雑な関数ではかえってバグを誘発しうる
  • PHP 8.5発表でいちばん興味深いのは、言語の安定性と成熟度

  • PHPがGTA6より先にarray_first、array_last、fatal error stack traceを追加するとは驚きだ

    • 良い追加機能ではあるが、実際にはarray_shiftやarray_popでも十分だった
  • PHPに新しい関数や構文が追加され続けるのは、長期的に保守コストを高める
    公式リリースノートを見ると、一部の機能は価値が曖昧だ

    • URI拡張は高速だが、既存のparse_url()と重複している
    • パイプ演算子は好みの問題で、コードスタイルの一貫性を損なう可能性がある
    • clone改善は小さな変更にすぎない
    • #Discard/voidは静的アナライザの機能を置き換えるものだ
    • 定数内クロージャは興味深いが、複雑な属性(#attribute)につながる可能性がある
    • cURL永続ハンドルは本当に性能向上につながる要素だ
    • array_first()は糖衣構文レベルで、大規模プロジェクトではほとんど使われなさそうだ
  • 公式PHP 8.5リリースノート

  • パイプ演算子の例は、ほとんどの言語で一時変数を使う一般的なやり方を省略したものだ
    URL解析の例もparse_url()と直接比較されていない

    • parse_url()は標準に完全準拠しておらず、相対URLの扱いに弱い
      新しいuri()関数はよりすっきりしており、部分適用機能が追加されればパイプチェーンはさらに読みやすくなるだろう
  • PHP CLIで**バックティック()でshell_exec()を呼ぶ**ことがあったが、今ではdeprecatedになった mkdir $dirname`のような形でよく使っていた

    • それはセキュリティ上のアンチパターン
      シェルのメタ文字注入リスクがあるので、PHPのmkdir()pcntl_exec()を使うべきだ