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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Atsushi Matsuo
July 27, 2026
Programming
22
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
760
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
220
個人的に嬉しかったpnpmの新機能・3選
matsuo_atsushi
0
260
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
720
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
380
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
330
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
1.9k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
630
OSSの開発や貢献時に役立つRFC
matsuo_atsushi
0
280
Other Decks in Programming
See All in Programming
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
700
Foundation Models frameworkで画像分析
ryodeveloper
1
620
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
110
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
190
「人を評価する AI」の設計と実装
ryoyanara
0
200
メールのエイリアス機能を履き違えない
isshinfunada
0
240
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
140
Google Apps Script で Ruby を動かす
kawahara
0
240
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
590
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
490
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
520
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
520
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
470
A Modern Web Designer's Workflow
chriscoyier
698
190k
Crafting Experiences
bethany
1
250
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Odyssey Design
rkendrick25
PRO
2
760
A designer walks into a library…
pauljervisheath
211
24k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
200
How to Ace a Technical Interview
jacobian
281
24k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
630
Producing Creativity
orderedlist
PRO
348
40k
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