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
Atsushi Matsuo
July 27, 2026
Programming
12
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
680
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
370
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
320
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
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
360
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
470
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
160
Build-to-own AI: Agentic Development for Humans
inesmontani
PRO
0
110
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
290
継続モナドとリアクティブプログラミング
yukikurage
3
650
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
330
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
170
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
680
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3.2k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
680
Google Apps Script で Ruby を動かす
kawahara
0
110
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Believing is Seeing
oripsolob
1
170
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Ethics towards AI in product and experience design
skipperchong
2
330
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
180
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Being A Developer After 40
akosma
91
590k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Side Projects
sachag
455
43k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
420
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