Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHP 8.5へのバージョンアップ時にも役立つAST(抽象構文木)
Search
Atsushi Matsuo
July 27, 2026
Programming
78
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
910
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
240
個人的に嬉しかったpnpmの新機能・3選
matsuo_atsushi
0
320
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
810
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
410
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
350
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
2k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
650
OSSの開発や貢献時に役立つRFC
matsuo_atsushi
0
290
Other Decks in Programming
See All in Programming
一人だけ、Kiroが静止する日
hideg
0
130
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
310
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
3.5k
アクセシビリティから考える情報設計
high_g_engineer
0
400
JRuby: Past, Present, and Future
headius
0
190
SREの越境 / SRE Collaboration
y0hgi
2
280
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
新卒PdEのリアル
ryu1013
1
520
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
300
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
570
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.5k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
470
Featured
See All Featured
From π to Pie charts
rasagy
1
380
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
260
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
200
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Deep Space Network (abreviated)
tonyrice
0
320
エンジニアに許された特別な時間の終わり
watany
109
250k
Technical Leadership for Architectural Decision Making
baasie
3
580
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
250
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
Docker and Python
trallard
47
4.2k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
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