Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP 8.5へのバージョンアップ時にも役立つAST(抽象構文木)

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

PHP 8.5へのバージョンアップ時にも役立つAST(抽象構文木)

2026-07-27 PHPerKaigi mini #3 LT資料
https://phperkaigi.connpass.com/event/397313/

Avatar for Atsushi Matsuo

Atsushi Matsuo

July 27, 2026

More Decks by Atsushi Matsuo

Other Decks in Programming

Transcript

  1. 自己紹介 自己紹介 • 松尾篤 • PHP使用歴:約21年 • PHPを使った開発歴は18年 • 2023年4月にGaroon開発チームに加入

    • これまでの登壇実績(PHPerKaigi関連) • PHPerKaigi 2025「Windows版PHPのビルド手順とPHP 8.4における変更点」 • PHPerKaigi 2026「PHPのバージョンアップ時にも役立ったAST(2026年版)」 3
  2. AST AST • 抽象構文木、Abstract Syntax Treeの略 • プログラムの本質的な構造を木構造で表したもの • ソースコードの解析や変換に活用できる

    • 括弧、空白、コメントなど表記上の情報は含まれず、論理的な構造の比較に適している ソースコード AST <?php $var = "Hello World!"; echo "${var}"; AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR name: "var" expr: "Hello World!" 1: AST_ECHO expr: AST_ENCAPS_LIST 0: AST_VAR name: "var" 6
  3. 同じソースコードであればASTも同じになる 同じソースコードであればASTも同じになる 1回目 ソースコード AST <?php $var = "Hello World!";

    echo "${var}"; AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR name: "var" expr: "Hello World!" 1: AST_ECHO expr: AST_ENCAPS_LIST 0: AST_VAR name: "var" ハッシュ値(SHA-256) 410dfe506da6502f9f81b89710ad379159b644d63520de6eca79f8ed86b6ffc4 7
  4. 同じソースコードであればASTも同じになる 同じソースコードであればASTも同じになる 1回目 ソースコード AST 2回目 <?php $var = "Hello

    World!"; echo "${var}"; AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR name: "var" expr: "Hello World!" 1: AST_ECHO expr: AST_ENCAPS_LIST 0: AST_VAR name: "var" ハッシュ値(SHA-256) ソースコード AST <?php $var = "Hello World!"; echo "${var}"; AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR name: "var" expr: "Hello World!" 1: AST_ECHO expr: AST_ENCAPS_LIST 0: AST_VAR name: "var" 410dfe506da6502f9f81b89710ad379159b644d63520de6eca79f8ed86b6ffc4 8
  5. "${var}"から"{$var}"に置き換えてもASTが変わらない "${var}"から"{$var}"に置き換えてもASTが変わらない "${var}" ソースコード AST "{$var}"; <?php $var = "Hello

    World!"; echo "${var}"; AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR name: "var" expr: "Hello World!" 1: AST_ECHO expr: AST_ENCAPS_LIST 0: AST_VAR name: "var" ハッシュ値(SHA-256) ソースコード AST <?php $var = "Hello World!"; echo "{$var}"; AST_STMT_LIST 0: AST_ASSIGN var: AST_VAR name: "var" expr: "Hello World!" 1: AST_ECHO expr: AST_ENCAPS_LIST 0: AST_VAR name: "var" 410dfe506da6502f9f81b89710ad379159b644d63520de6eca79f8ed86b6ffc4 9
  6. PHP 8.5で注目した非推奨項目 PHP 8.5で注目した非推奨項目 • PHP 8.5.x で推奨されなくなる機能 : https://www.php.net/manual/ja/migration85.deprecated.php

    • 正規化されていない型名でのキャスト • “正規化されていない型名 (boolean), (integer), (double), (binary) でキャストすることは、 推奨されなくなりました。 (bool), (int), (float), (string) をそれぞれ使ってください。” • セミコロンでcase文を終了させる • “case文をコロンではなく、セミコロンで終了させることは、 推奨されなくなりました。” 10
  7. 正規化されていない型名でのキャスト 正規化されていない型名でのキャスト • (integer)は(int)に、(boolean)は(bool)に、(double)は(float)に、(binary)は(string)に変える • ソースコードの表記は変わっているが、ASTとしては同じ構造になることが期待できそうに見える • 実際にphp-astを使って確認してみたところ、対象となるキャスト表記を正規化したうえで変更前後の ASTを比較し、ASTに差分が出ないことを確認できた PHP

    8.4でphp-astを使用 PHP 8.5でphp-astを使用 変更前のソースコード 4693d072bbfa4fb1832507cd6bea6 183e79a5f1bf42bddd1f47df8b7e5b 454b6 4693d072bbfa4fb1832507cd6bea6 183e79a5f1bf42bddd1f47df8b7e5b 454b6 変更後のソースコード 4693d072bbfa4fb1832507cd6bea6 183e79a5f1bf42bddd1f47df8b7e5b 454b6 4693d072bbfa4fb1832507cd6bea6 183e79a5f1bf42bddd1f47df8b7e5b 454b6 11
  8. switch文のcaseをセミコロンで終了させる書き方 switch文のcaseをセミコロンで終了させる書き方 • case文の末尾にある ;(セミコロン)を :(コロン)に変更した場合 • テキストとしては;が:に変わるため差分があるが、構文上はどちらもswitch文のcaseラベルを表す • バージョンアップ前のPHP

    8.4環境でphp-astを使って確認してみたところ、セミコロンをコロンに置き 換えてもASTは同じであり、switch文の分岐構造そのものは変わっていないことを確認できた PHP 8.4でphp-astを使用 PHP 8.5でphp-astを使用 変更前のソースコード 617f67046f0e38cb19be702c4946a a21dbf9fc5817f2450305d12a59c15 b243b4ae61bdd445c1d8a51afe8cfe 0861fe3d161db5c4ae9e0363560cc 9a0ae a5ee4 変更後のソースコード 617f67046f0e38cb19be702c4946a 617f67046f0e38cb19be702c4946a b243b4ae61bdd445c1d8a51afe8cfe b243b4ae61bdd445c1d8a51afe8cfe 9a0ae 9a0ae 12
  9. 15