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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Atsushi Matsuo
July 27, 2026
Programming
61
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
900
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
240
個人的に嬉しかったpnpmの新機能・3選
matsuo_atsushi
0
300
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
780
テストや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
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
130
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
270
Webの地図
yosuke_furukawa
PRO
6
4.6k
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
170
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
710
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
400
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
180
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
690
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
240
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
720
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.8k
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
The Curse of the Amulet
leimatthew05
3
14k
Become a Pro
speakerdeck
PRO
31
6.3k
Designing Experiences People Love
moore
143
24k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Scaling GitHub
holman
464
140k
The Language of Interfaces
destraynor
162
27k
HDC tutorial
michielstock
2
870
Design in an AI World
tapps
1
320
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Building Flexible Design Systems
yeseniaperezcruz
330
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