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 8.5へのバージョンアップ時にも役立つAST(抽象構文木)
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Atsushi Matsuo
July 27, 2026
Programming
10
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHP 8.5へのバージョンアップ時にも役立つAST(抽象構文木)
2026-07-27 PHPerKaigi mini #3 LT資料
https://phperkaigi.connpass.com/event/397313/
Atsushi Matsuo
July 27, 2026
More Decks by Atsushi Matsuo
See All by Atsushi Matsuo
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
700
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
210
個人的に嬉しかったpnpmの新機能・3選
matsuo_atsushi
0
240
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
670
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
360
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
310
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
1.9k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
620
OSSの開発や貢献時に役立つRFC
matsuo_atsushi
0
280
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
220
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
150
関数型プログラミングのメリットって何だろう?
wanko_it
0
190
共通化で考えるべきは、実装より公開する型だった
codeegg
0
280
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
860
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.2k
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3.4k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
370
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
200
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
280
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
180
Featured
See All Featured
Test your architecture with Archunit
thirion
1
2.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
How GitHub (no longer) Works
holman
316
150k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
470
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
270
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
The Invisible Side of Design
smashingmag
301
52k
We Are The Robots
honzajavorek
0
280
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
New Earth Scene 8
popppiees
3
2.4k
Transcript
PHP 8.5へのバージョンアップ時にも役立つ AST(抽象構文木) 2026年7月27日 PHPerKaigi mini #3 サイボウズ株式会社 松尾篤 1
今回の話題 今回の話題 • PHP 8.4からPHP 8.5に更新する作業の一部でAST(抽象構文木)が役立つ場合がある • PHPのバージョンアップ時にASTの差分がないことを確認することで大幅にテスト工数を削減できたケースが あったことをPHPerKaigi 2026で紹介
• 今回はその考え方をPHP 8.5へのバージョンアップ時にも適用できるケースがあることを紹介 2
自己紹介 自己紹介 • 松尾篤 • PHP使用歴:約21年 • PHPを使った開発歴は18年 • 2023年4月にGaroon開発チームに加入
• これまでの登壇実績(PHPerKaigi関連) • PHPerKaigi 2025「Windows版PHPのビルド手順とPHP 8.4における変更点」 • PHPerKaigi 2026「PHPのバージョンアップ時にも役立ったAST(2026年版)」 3
セキュリティのためにもバージョンアップは必要 セキュリティのためにもバージョンアップは必要 • プロダクトを長期的に安全に運用するためにはPHPを継続的に更新していく必要がある • サポートが終了したバージョンのPHPに脆弱性が見つかっても当該脆弱性が修正されないままとなってしまう • 一方で、PHPのバージョンアップは簡単ではない • 特に大規模プロダクトでは影響範囲の調査や修正、テストなどに大きな工数がかかってしまう
4
ASTがPHPのバージョンアップ時にも役立った事例 ASTがPHPのバージョンアップ時にも役立った事例 • PHPerKaigi 2026におけるトーク「PHPのバージョンアップ時にも役立ったAST(2026年版)」 • PHP 8.1からPHP 8.2にバージョンアップする作業の一部で大幅にテスト工数を削減できた事例を紹介 •
ASTのハッシュ値が同じであればプログラムの変更前と変更後の間に差分がないと判断できるケースがあった • https://fortee.jp /phperkaigi-2026/proposal/6c422c5c-8789-4464-9ccd-5e351a0f3bbc 5
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
同じソースコードであれば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
同じソースコードであれば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
"${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
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
正規化されていない型名でのキャスト 正規化されていない型名でのキャスト • (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
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
ASTに差分がないことを確認してテスト方針を決める ASTに差分がないことを確認してテスト方針を決める • ASTに差分がないからといって、あらゆる観点で安全であると断言できるわけではない • 表記は変わるが構文上の構造は変わらないことを確認したい場合にはASTの比較は強力な判断材料になる • プログラムの変更前後でASTに差分がないことを確認できれば、PHPのパーサーが解釈する構文の構造は 変わっていないと判断できる •
これにより、テスト範囲を必要以上に広げずに済ませたりできる場合がある 13
まとめ まとめ • ASTが変わらない変更を見分ければ、PHPの移行ガイドはテスト工数削減のヒントに変わる • 通常、PHPをバージョンアップする際には多くの変更点の調査やテストが必要になる • 構文の見た目は変わっていても、ASTが変化せず、プログラム構造としては同等とみなせる変更も一部存在する • 11月に開催されるPHPカンファレンス新潟2026で「PHPのバージョンアップ時にASTが変わらない変更
の見抜き方」というタイトルで話す予定 • https://fortee.jp /phpconniigata-2026/proposal/864dc7b4-a861-44c1-ba08-af3e873db2ba 14
15