Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPのバージョンアップ時にも役立ったAST(2026年版)
Search
Atsushi Matsuo
March 21, 2026
Programming
0
6
PHPのバージョンアップ時にも役立ったAST(2026年版)
2026-03-21 PHPerKaigi 2026 レギュラートーク資料
https://fortee.jp/phperkaigi-2026
Atsushi Matsuo
March 21, 2026
Tweet
Share
More Decks by Atsushi Matsuo
See All by Atsushi Matsuo
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
250
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
250
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
1.5k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
550
OSSの開発や貢献時に役立つRFC
matsuo_atsushi
0
250
PHPの開発に貢献する4つの方法
matsuo_atsushi
0
470
Other Decks in Programming
See All in Programming
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
230
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
5
1k
Goの型安全性で実現する複数プロダクトの権限管理
ishikawa_pro
2
430
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
150
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.4k
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
580
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
570
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
120
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.2k
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
15
8.9k
「やめとこ」がなくなった — 1月にZennを始めて22本書いた AI共創開発のリアル
atani14
0
400
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.4k
Featured
See All Featured
We Are The Robots
honzajavorek
0
200
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
980
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Accessibility Awareness
sabderemane
0
82
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
440
Odyssey Design
rkendrick25
PRO
2
550
WENDY [Excerpt]
tessaabrams
9
36k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
860
HDC tutorial
michielstock
1
550
Writing Fast Ruby
sferik
630
63k
Transcript
PHPのバージョンアップ時にも役立った AST(2026年版) 2026年3月21日 PHPerKaigi 2026 サイボウズ株式会社 松尾篤 1
PHPのバージョンアップ時にも役立ったAST(2026年版) トークの概要 はじめに • 勉強会で学んだことが実際の業務に役立った事例を紹介 • AST(抽象構文木、Abstract Syntax Treeの略)がPHP 8.1からPHP
8.2に バージョンアップした際の作業の一部で役立った事例 • ASTのハッシュ値に差分がないことを確認することで大幅にテスト工数を削減 2
PHPのバージョンアップ時にも役立ったAST(2026年版) 今回の話題 はじめに • PHPのリリースサイクルとバージョンアップの必要性 • PHPのバージョンアップ時に参照する移行ガイド • バージョンアップ時に挙動が変わらない根拠としてASTに着目 •
PHPでASTを取得およびそのハッシュ値を比較する方法 • ASTのハッシュ値を確認する際に留意する点 3
PHPのバージョンアップ時にも役立ったAST(2026年版) 2026年版で新たに追加した話題 はじめに • PHP 8.5にバージョンアップする際にASTを活用できるケース • ASTを使った影響範囲調査の応用例 4
PHPのバージョンアップ時にも役立ったAST(2026年版) 自己紹介 はじめに 松尾篤 • PHP使用歴:約21年 • PHPを使った開発歴は約18年 • 2023年4月にGaroon開発チームに加入
• Garoonのセキュリティを維持するYukimiチームの紹介 https://blog.cybozu.io/entry/2023/10/04/101916 • 過去にコントリビュートしたことがあるPHP関連のOSS(抜粋) • PHP-Parser • Phan • phpDocumentor • PHP Debug Bar • Smarty • Windows版PHP用libxml2 5
PHPのリリースサイクルと バージョンアップの必要性 6
PHPのバージョンアップ時にも役立ったAST(2026年版) PHPのリリースサイクル PHPのリリースサイクルとバージョンアップの必要性 • 年に1回新しいバージョンが公開 • 2年間のアクティブサポート期間 • リリースされてから不具合やセキュリティの問題が修正される •
アクティブサポート期間の後に2年間のセキュリティサポート期間 • 重要なセキュリティ問題のみが修正される 7
PHPのバージョンアップ時にも役立ったAST(2026年版) もしもバージョンアップを行わなかったら PHPのリリースサイクルとバージョンアップの必要性 • PHPのセキュリティサポート期間の終了を迎えることになる • PHPに起因する不具合やセキュリティ脆弱性に対応できなくなる • 深刻なセキュリティ脆弱性がPHPに見つかって製品に重大な影響を与えて しまうような問題が出てきた場合にユーザーが危険な状況に陥ってしまう
• サービスやビジネスの継続に影響を与えてしまう恐れも 8
PHPのバージョンアップ時にも役立ったAST(2026年版) セキュリティのためにもバージョンアップは必要 PHPのリリースサイクルとバージョンアップの必要性 • セキュリティに対するリスクマネジメントは重要な経営課題の1つ • 最新のセキュリティ更新をすぐに取り込める状態を保つことはとても重要 • 日頃から製品で使用しているソフトウェアやライブラリを更新できる状態 や体制を整えておくことが大事
9
PHPのバージョンアップ時にも役立ったAST(2026年版) Garoon開発チームが過去のバージョンアップ時に直面した課題たち PHPのリリースサイクルとバージョンアップの必要性 • PHP 8.0:比較演算子の挙動変更 20年ものの巨大レガシープロダクトをPHP 8.0にアップデートした際の対策と得られた知見 by 赤間
仁志 https://speakerdeck.com/akamah/20nian-mononoju-da-regasipurodakutowo-php-8-dot-0niatupudetositaji-nodui-ce-tode-raretazhi-jian • PHP 8.1:mb_detect_encoding()の仕様変更 Garoon開発チームではPHP8.1の仕様変更とどう向き合ってきたのか by 千葉 泰理(ぱくとま) https://speakerdeck.com/pakutoma/how-we-have-responded-to-the-php-8-dot-1-mbstring-specification-changes • PHP 8.2:動的プロパティの非推奨化 PHP 9 に備えよ - 動的プロパティ、どうすればいぃ? by 荒瀬 泰輔 https://speakerdeck.com/taisukearase/php-9-nibei-eyo-dong-de-puropatei-dousurebaii 10
PHPのバージョンアップ時に 参照する移行ガイド 11
PHPのバージョンアップ時にも役立ったAST(2026年版) PHPをバージョンアップする前に PHPのバージョンアップ時に参照する移行ガイド • 移行ガイドを必ず確認 • PHP 8.2の場合:https://www.php.net/manual/ja/migration82.php • 新機能だけでなく推奨されなくなる機能や下位互換性のない変更点も記載
• 移行ガイドに記載されている内容に基づいて製品への影響がないか調査 12
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.2で推奨されなくなる機能 PHPのバージョンアップ時に参照する移行ガイド • https://www.php.net/manual/ja/migration82.deprecated.php より • 動的なプロパティの利用 •
部分的にしかサポートされていない callable • ”${var}” / “${expr}” 形式の、文字列への値の埋め込み • 'テキストエンコーディング' QPrint, Base64, Uuencode, HTML-ENTITIES • 内部メソッド SplFileInfo::_bad_state_ex() • utf8_encode() と utf8_decode() 13
PHPのバージョンアップ時にも役立ったAST(2026年版) 製品への影響が特に大きかったPHP 8.2で推奨されなくなる機能 PHPのバージョンアップ時に参照する移行ガイド • 動的なプロパティの利用 • ”${var}” / “${expr}”
形式の、文字列への値の埋め込み(今回の話題) 14
PHPのバージョンアップ時にも役立ったAST(2026年版) ”${var}” / “${expr}” 形式の、文字列への値の埋め込み PHPのバージョンアップ時に参照する移行ガイド • "${var}"や"${expr}"といった形式での書き方が推奨されなくなった • "$var"、"{$var}"および"{${expr}}"といった形式で今後は書いていく
必要がある 15
PHPのバージョンアップ時にも役立ったAST(2026年版) ”${var}” / “${expr}” 形式の、文字列への値の埋め込み PHPのバージョンアップ時に参照する移行ガイド • PHP 9.0ではサポートされなくなる見通し •
https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation 16
PHPのバージョンアップ時にも役立ったAST(2026年版) ”${var}” / “${expr}” 形式の、文字列への値の埋め込み PHPのバージョンアップ時に参照する移行ガイド • PHPStanでは検出できなかった • https://github.com/phpstan/phpstan/issues/8744
17
PHPのバージョンアップ時にも役立ったAST(2026年版) 大量に見つかった変更すべき箇所 PHPのバージョンアップ時に参照する移行ガイド • PHPスクリプトのソースコードだけでも120万行以上ある製品 • 事前の調査で「“${var}” / “${expr}” 形式の、文字列への値の埋め込
み」だけでも434箇所変更すべき箇所が見つかっていた • PHP 8.2でPhanを使って検出(Issue Type : PhanDeprecatedEncapsVar) 18
PHPのバージョンアップ時にも役立ったAST(2026年版) 品質保証やテスト戦略をどうするべきかという課題に直面 PHPのバージョンアップ時に参照する移行ガイド • 大量に見つかった変更すべき箇所のソースコードを変更した場合に挙動が 変わらないように品質をどう担保するか • 変更する箇所すべてに対して1箇所ずつ細かくテストするのは手間や期間 を考えると現実的に無理 •
テスト工数を抑えられるような良い方法はないか思案 19
バージョンアップ時に 挙動が変わらない根拠としてASTに着目 20
PHPのバージョンアップ時にも役立ったAST(2026年版) AST バージョンアップ時に挙動が変わらない根拠としてASTに着目 • Abstract Syntax Treeの略 • 抽象構文木 •
ソースコードを解析した後の木構造 • ソースコードの解析や変換に活用できる 21 ソースコード 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" <?php $var = "Hello World!"; echo "${var}"; AST
PHPのバージョンアップ時にも役立ったAST(2026年版) きっかけはPHP勉強会@東京 バージョンアップ時に挙動が変わらない根拠としてASTに着目 • PHP 8.2にバージョンアップする際の「"${var}" / "${expr}" 形式の、 文字列への値の埋め込み」についてはASTを活用できることに気づく
• 2023年11月に開催された「第158回 PHP勉強会@東京」で金城さんの ASTに関する発表を聞いたことがきっかけ 22 金城さんのASTに関する発表スライドより
PHPのバージョンアップ時にも役立ったAST(2026年版) ASTのハッシュ値が同じならプログラムの変更前後で差分がないと判断可能 バージョンアップ時に挙動が変わらない根拠としてASTに着目 • 第158回 PHP勉強会@東京における金城さんのASTに関する発表 • プログラムの本質的構造を示すASTのハッシュ値が同じであればプログラムの 変更前と変更後の間に差分がないと判断できるという内容の発表 •
https://speakerdeck.com/o0h/php-ast-check-diff 23 金城さんのASTに関する発表スライドより
PHPのバージョンアップ時にも役立ったAST(2026年版) 同じソースコードであればASTも同じになる バージョンアップ時に挙動が変わらない根拠としてASTに着目 24 ソースコード 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" <?php $var = "Hello World!"; echo "${var}"; 410dfe506da6502f9f81b89710ad379159b644d63520de6eca79f8ed86b6ffc4 1回目 AST ハッシュ値(SHA-256)
PHPのバージョンアップ時にも役立ったAST(2026年版) 同じソースコードであればASTも同じになる バージョンアップ時に挙動が変わらない根拠としてASTに着目 25 ソースコード 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" <?php $var = "Hello World!"; echo "${var}"; 410dfe506da6502f9f81b89710ad379159b644d63520de6eca79f8ed86b6ffc4 1回目 AST ハッシュ値(SHA-256) ソースコード 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" <?php $var = "Hello World!"; echo "${var}"; 2回目 AST
PHPのバージョンアップ時にも役立ったAST(2026年版) "${var}"から"{$var}"に置き換えてもASTが変わらない バージョンアップ時に挙動が変わらない根拠としてASTに着目 26 ソースコード 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" <?php $var = "Hello World!"; echo "${var}"; 410dfe506da6502f9f81b89710ad379159b644d63520de6eca79f8ed86b6ffc4 "${var}" AST ハッシュ値(SHA-256) ソースコード 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" <?php $var = "Hello World!"; echo "{$var}"; "{$var}"; AST
PHPのバージョンアップ時にも役立ったAST(2026年版) ASTのハッシュ値が同じなら変更前後で挙動の変更がないと判断可能 バージョンアップ時に挙動が変わらない根拠としてASTに着目 • “${var}”から”{$var}”に機械的に置き換えてもASTが同じならソース コードの変更前後で挙動の変更もないと見なせる • 技術的に自信を持ってテスト不要と判断できる • ハッシュ値を比較に使うことで差分の有無を簡単に確認できる
27
PHPでASTを取得および そのハッシュ値を比較する方法 28
PHPのバージョンアップ時にも役立ったAST(2026年版) ASTの取得に使ったソフトウェア PHPでASTを取得およびそのハッシュ値を比較する方法 • PHPの主要なコントリビューターの1人として活動していたNikita Popov さんが開発したツールを使用 • php-ast •
https://github.com/nikic/php-ast • PHP-Parser • https://github.com/nikic/PHP-Parser 29 https://github.com/nikic/php-ast?tab=readme-ov-file#differences-to-php-parser
PHPのバージョンアップ時にも役立ったAST(2026年版) ASTを取得およびそのハッシュ値を比較する手順の流れ PHPでASTを取得およびそのハッシュ値を比較する方法 • PHP 8.1の環境にphp-astをインストール • php.iniに「extension=ast.so」(Windowsの場合には 「extension=php_ast.dll」)を追加 •
php-astを使用してASTを取得 • hash()を使って取得したASTのハッシュ値(SHA-256)を生成 • 変更前と変更後のハッシュ値を比較して一致するか確認 30
PHPのバージョンアップ時にも役立ったAST(2026年版) php-astのインストール PHPでASTを取得およびそのハッシュ値を比較する方法 • https://github.com/nikic/php-ast?tab=readme-ov-file#installation を参照 • macOSやLinuxの場合 • 「pecl
install ast」を実行してphp.iniに「extension=ast.so」を追加 • 今ならPIE(PHP Installer for Extensions)を使ってインストールする方法も • もしくはコンパイルしてからインストールする方法もある(phpize → ./configure → make → sudo make install) • Windowsの場合 • php-astのDLLファイルをダウンロードしてextディレクトリに配置してからphp.ini に「extension=php_ast.dll」を追加 31
PHPのバージョンアップ時にも役立ったAST(2026年版) php-astのutil.phpで定義されているast_dump()でASTを出力できる PHPでASTを取得およびそのハッシュ値を比較する方法 • https://github.com/nikic/php-ast?tab=readme-ov-file#example 32 https://github.com/nikic/php-ast?tab=readme-ov-file#example
PHPのバージョンアップ時にも役立ったAST(2026年版) php-astでASTを取得するサンプル PHPでASTを取得およびそのハッシュ値を比較する方法 • php-astを使用してASTを取得 • php-astのutil.phpで定義されているast_dump()を使用 33
PHPのバージョンアップ時にも役立ったAST(2026年版) php-astでASTのハッシュ値を取得するサンプル PHPでASTを取得およびそのハッシュ値を比較する方法 • hash()を使って取得したASTのハッシュ値(SHA-256)を生成 • 引数にファイルパスを指定して実行 • 実行例 :
php dump-ast-hash-by-php-ast.php /path/to/file.php 34
ASTのハッシュ値を確認する際に 留意する点 35
PHPのバージョンアップ時にも役立ったAST(2026年版) php-astを実行するPHPのバージョンを意識する ASTのハッシュ値を確認する際に留意する点 • "${var}"から"{$var}"への変更については • PHP 8.2でphp-astを使った場合 • 変更前のソースコードだとPHP
8.1で出力したASTと変わった • 変更後のソースコードであればPHP 8.1で出力したASTと同じになった • PHP 8.1でphp-astを使った場合 • ソースコードの変更前後でASTは変わらなかった • 使っているPHPのバージョンを変えずにASTのハッシュ値が同じか確認可能だった 36
PHPのバージョンアップ時にも役立ったAST(2026年版) どの場合に差分が発生するか検証する ASTのハッシュ値を確認する際に留意する点 37 PHP 8.1でphp-astを使用 PHP 8.2でphp-astを使用 変更前のソースコード 410dfe506da6502f9f81b89710a
d379159b644d63520de6eca79f 8ed86b6ffc4 2c12d382a9c54af519fbb7391c8 5f0652236bd896e464a2a9ff055c e9fd26068 変更後のソースコード 410dfe506da6502f9f81b89710a d379159b644d63520de6eca79f 8ed86b6ffc4 410dfe506da6502f9f81b89710a d379159b644d63520de6eca79f 8ed86b6ffc4 <?php $var = "Hello World!"; echo "${var}"; <?php $var = "Hello World!"; echo "{$var}"; • PHP-Parserを使った場合にはPHP 8.1でもPHP 8.2でも今回対象としてい る範囲においてはASTは同じだった • php-astを使った場合には変更前のソースコードに対してPHP 8.2で実行 するとASTが変わった • 同じソースコードでも、使用するツールやPHPのバージョンが異なると ハッシュ値が一致しない場合がある PHPの各バージョンでphp-astを使用して出力したASTのハッシュ値
PHPのバージョンアップ時にも役立ったAST(2026年版) 結果としてどう使い分けたか ASTのハッシュ値を確認する際に留意する点 • 影響箇所を検出するために内部的にphp-astを用いるPhanをPHP 8.2で 使った • ASTのハッシュ値が一致するか確認する用途にphp-astをPHP 8.1で使用
• 複数バージョンのPHPおよび複数のツールを使って検証することは大事 38
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.1でphp-astを使っても例外的にハッシュ値が変わるケースがあった ASTのハッシュ値を確認する際に留意する点 39 ソースコード <?php declare(strict_types = 1);
class HelloWorld { /** * "${var}" */ public function sayHello(): string { return "Hello World!"; } } 32e80262eee2882016b752815393917a2d79efda6cdfefb8f8a40e26d7122a75 "${var}" ハッシュ値 ソースコード <?php declare(strict_types = 1); class HelloWorld { /** * "{$var}" */ public function sayHello(): string { return "Hello World!"; } } f71118033b77fbe03e32eb2f971a463e17b938f2c1ce8b70d68872116331e06c "{$var}" ハッシュ値
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.1でphp-astを使っても例外的にハッシュ値が変わるケースがあった ASTのハッシュ値を確認する際に留意する点 • コード本体ではなくコメントまで一括置換したケース • PHP CS FixerやRectorによる置換ではなく、テキストエディターやIDEを使っ
て単に「${」を「{$」に一括置換した場合 • DocComment(/** */で括られるコメント)内にある"${var}"および "${expr}"形式で書かれている文字列を置換した場合はphp-astで取得した ASTのハッシュ値が変わる場合があった • DocComment内を置換しなかった場合にはASTのハッシュ値は同じだった • 最終的にDocComment内部での置き換えであれば挙動への影響はないと判断 40
まとめ 41
PHPのバージョンアップ時にも役立ったAST(2026年版) まとめ まとめ • 実際のプロダクト開発においてPHP 8.1からPHP 8.2にバージョンアップ する作業の一部を効率化し大幅にテスト工数を削減できた • ソースコードを変更した際にASTのハッシュ値が同じなら、プログラムの
変更前後で差分がないと見なすことができ、技術的に自信を持ってテスト 不要と判断できる • アイデア次第でASTは他の場面でも役立つ可能性がある 42
PHP 8.5にバージョンアップする際に ASTを活用できるケース 43
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.5で注目した非推奨項目 PHP 8.5にバージョンアップする際にASTを活用できるケース • PHP 8.5.x で推奨されなくなる機能 https://www.php.net/manual/ja/migration85.deprecated.php
• 正規化されていない型名でのキャスト • “正規化されていない型名 (boolean), (integer), (double), (binary) でキャストす ることは、 推奨されなくなりました。 (bool), (int), (float), (string) をそれぞれ 使ってください。” • セミコロンでcase文を終了させる • “case文をコロンではなく、セミコロンで終了させることは、 推奨されなくなりま した。” 44
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.5にバージョンアップする際にASTを活用できる変更内容 PHP 8.5にバージョンアップする際にASTを活用できるケース • PHP 8.2で非推奨になった「”${var}” / “${expr}”
形式の、文字列への 値の埋め込み」と同様の扱いができる変更 • 正規化されていない型名でのキャスト • (boolean) → (bool) • (integer) → (int) • (double) → (float) • (binary) → (string) • セミコロンでcase文を終了させる • case文の末尾にある ;(セミコロン) → :(コロン) 45
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.4とPHP 8.5でASTのハッシュ値を比較した結果 PHP 8.5にバージョンアップする際にASTを活用できるケース • 正規化されていない型名でのキャストを変更した場合 • PHP
8.4でphp-astを使って取得したASTは、ソースコードの変更前後で変わ らなかった • PHP 8.5でphp-astを使って取得したASTも、ソースコードの変更前後で変わ らなかった • PHP 8.5でphp-astを使って取得したASTは、PHP 8.4でphp-astを使って取得 したASTと同じだった 46 PHP 8.4でphp-astを使用 PHP 8.5でphp-astを使用 変更前のソースコード 4693d072bbfa4fb1832507cd6bea61 83e79a5f1bf42bddd1f47df8b7e5b45 4b6 4693d072bbfa4fb1832507cd6bea61 83e79a5f1bf42bddd1f47df8b7e5b45 4b6 変更後のソースコード 4693d072bbfa4fb1832507cd6bea61 83e79a5f1bf42bddd1f47df8b7e5b45 4b6 4693d072bbfa4fb1832507cd6bea61 83e79a5f1bf42bddd1f47df8b7e5b45 4b6 PHPの各バージョンでphp-astを使用して出力したASTのハッシュ値
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.4とPHP 8.5でASTのハッシュ値を比較した結果 PHP 8.5にバージョンアップする際にASTを活用できるケース • case文の末尾にある ;(セミコロン)を :(コロン)に変更した場合
• PHP 8.4でphp-astを使って取得したASTは、ソースコードの変更前後で変わ らなかった • 変更後のソースコードに対してPHP 8.5でphp-astを使って取得したASTは、 PHP 8.4でphp-astを使って取得したASTと同じだった • 変更前のソースコードに対してPHP 8.5でphp-astを使って取得したASTは、 PHP 8.4でphp-astを使って取得したASTと変わった 47 PHP 8.4でphp-astを使用 PHP 8.5でphp-astを使用 変更前のソースコード 617f67046f0e38cb19be702c4946ab2 43b4ae61bdd445c1d8a51afe8cfe9 a0ae a21dbf9fc5817f2450305d12a59c150 861fe3d161db5c4ae9e0363560cca5 ee4 変更後のソースコード 617f67046f0e38cb19be702c4946ab2 43b4ae61bdd445c1d8a51afe8cfe9 a0ae 617f67046f0e38cb19be702c4946ab2 43b4ae61bdd445c1d8a51afe8cfe9 a0ae PHPの各バージョンでphp-astを使用して出力したASTのハッシュ値
PHPのバージョンアップ時にも役立ったAST(2026年版) PHP 8.5でASTのハッシュ値を取得する際に留意する点 PHP 8.5にバージョンアップする際にASTを活用できるケース • php-astを使う際にはPHP 8.5に対応したphp-ast 1.1.3に更新する •
php-astでパースする際に指定するASTバージョンも更新する • 変更前:parse_code($code, $version=100); • 変更後:parse_code($code, $version=120); • php-astのASTバージョンが異なると出力されるASTが変わる 48 https://github.com/nikic/php-ast/releases/tag/v1.1.3
ASTを使った影響範囲調査の応用例 49
PHPのバージョンアップ時にも役立ったAST(2026年版) ASTを使った影響範囲の調査例 ASTを使った影響範囲調査の応用例 • ASTは挙動の比較だけでなく影響範囲の絞り込みにも応用可能 • 単純な文字列検索よりASTをパースする方が影響範囲を絞り込みやすい • セミコロンで終了しているcase文の検出 •
単なる「;」の検索では関係ない箇所がたくさん見つかってしまう • 非推奨になった関数やデバッグ用に使用している関数の検出 • コメントのように実際に関数を呼び出していない箇所や、似た名前の関数および接 頭辞が異なる関数が見つかってしまう • PHP 8.0で挙動が変更された比較演算子が実行される可能性がある箇所の検出 • 単なる「==」の検索では実際には挙動が変わらない箇所が数多く見つかってしまう 50
まとめ 51
PHPのバージョンアップ時にも役立ったAST(2026年版) まとめ(再掲) まとめ • 実際のプロダクト開発においてPHP 8.1からPHP 8.2にバージョンアップ する作業の一部を効率化し大幅にテスト工数を削減できた • ソースコードを変更した際にASTのハッシュ値が同じなら、プログラムの
変更前後で差分がないと見なすことができ、技術的に自信を持ってテスト 不要と判断できる • アイデア次第でASTは他の場面でも役立つ可能性がある 52
PHPのバージョンアップ時にも役立ったAST(2026年版) “Connecting the dots” まとめ • 勉強会でASTのハッシュ値が同じであればプログラムの変更前と変更後の 間に差分がないと判断できるという発表を聞いたことがきっかけ • 関心を持ち続けながら勉強会に参加しているとふとしたことがきっかけで
後で役に立つことがある • 機会があればカンファレンスや勉強会に参加してみてはいかがでしょうか 53
©️ Cybozu, Inc. 54