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
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
Search
Atsushi Matsuo
May 09, 2026
Programming
280
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
2026-05-09 PHPカンファレンス香川2026 レギュラートーク資料
https://fortee.jp/phpconkagawa-2026
Atsushi Matsuo
May 09, 2026
More Decks by Atsushi Matsuo
See All by Atsushi Matsuo
PHP 8.5へのバージョンアップ時にも役立つAST(抽象構文木)
matsuo_atsushi
0
95
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
960
個人的に嬉しかったpnpmの新機能・3選
matsuo_atsushi
0
350
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
860
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
450
PHPライセンス変更の議論を通じて学ぶOSSライセンスの基礎
matsuo_atsushi
0
360
Windows版PHPのビルド手順とPHP 8.4における変更点
matsuo_atsushi
0
2.1k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
660
OSSの開発や貢献時に役立つRFC
matsuo_atsushi
0
300
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
350
Jetpack Compose Mechanisms
skydoves
2
660
sbt 2.0: takeoff
eed3si9n
0
110
wkhtmltopdfの次どうするか問題2026
willnet
2
1.9k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
21
21k
Simple Storage Service(S3) is not simple
iwatsukayura
0
230
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
520
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
170
速習iPhone Duo対応
yuukiw00w
2
970
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
160
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
240
最近”作らせてる” ローカルAIアプリの話
akit37
0
430
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
860
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
520
The World Runs on Bad Software
bkeepers
PRO
72
12k
Utilizing Notion as your number one productivity tool
mfonobong
4
610
It's Worth the Effort
3n
188
29k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.3k
A Soul's Torment
seathinner
8
3.7k
Transcript
20年以上続くプロダクトでも 使い続けられる静的解析ツールを求めて 2026年5月9日 PHPカンファレンス香川2026 サイボウズ株式会社 松尾篤 1
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて このトークで伝えたいこと はじめに • PHPの変化に追従および備える上で静的解析は役に立つこと • 重要なのは「いきなり理想の静的解析ルールを適用すること」ではなく 「継続して改善しながら運用していけること」 • 皆さんもOSSへのコントリビューションに取り組んでみませんか
2
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 今回の話題 はじめに • 開発チームで使用していた静的解析ツールで直面した課題 • 静的解析ツールを変更しようとして遭遇した問題 • OSSへのコントリビューション事例と現状 •
今後に向けて注目しているMago • 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 3
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 自己紹介 はじめに 松尾篤 • PHP使用歴:約21年 • PHPを使った開発歴は約18年 • 2023年4月にGaroon開発チームに加入
• Garoonのセキュリティを維持するYukimiチームの紹介 https://blog.cybozu.io/entry/2023/10/04/101916 • 過去にコントリビュートしたことがあるPHP関連のOSS(抜粋) • Phan • PHP-Parser • Smarty • Windows版PHP用libxml2 4
開発チームで使用していた 静的解析ツールで直面した課題 5
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて サイボウズ Garoon 開発チームで使用していた静的解析ツールで直面した課題 • 中堅・大規模組織向けグループウェア • チーム、部署、全社に必要な情報が集約され一目で確認できる • 20年以上開発が続いている巨大なコードベースを持つプロダクト
• 2002年9月にパッケージ版Garoonの提供を開始 • 2011年12月にクラウド版Garoonの提供を開始 • 長い歴史の中で多様な実装パターンが蓄積 • 古い書き方と新しい書き方が混在 6
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 静的解析 開発チームで使用していた静的解析ツールで直面した課題 • プログラムを実行せずにソースコードを解析して潜在的な不具合や品質上 の問題を検出する手法 • 代表的なPHP向け静的解析ツール • PHPStan
: https://github.com/phpstan/phpstan • Psalm : https://github.com/vimeo/psalm • Phan : https://github.com/phan/phan • Mago : https://github.com/carthage-software/mago 7
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 開発チームで使用していた静的解析ツール 開発チームで使用していた静的解析ツールで直面した課題 • 2016年にPHP 5からPHP 7への移行をスムーズに行うためにPhanを導入 • (日本語訳) Migrating
Garoon codebase to PHP 7 - Cybozu Inside Out https://blog.cybozu.io/entry/2017/10/16/080000 • PhanのベースラインとCIのキャッシュを利用してPhanのルールが自動的 に強くなる仕組みを作成 • CircleCIで勝手に強くなる静的解析の作り方 - Cybozu Inside Out https://blog.cybozu.io/entry/2020/07/08/080000 • CI/CDパイプラインではPhanを長年使用していた状況 • 必要に応じてPHPStanも併用 8
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phanで直面した機能面の課題 開発チームで使用していた静的解析ツールで直面した課題 • 2025年2月に製品で使用しているPHPをPHP 8.3に更新したが、当時の PhanがPHP 8.3の構文を公式にサポートしていない状況だった • 実際に検証しPHP
8.3の構文のうち一部未対応の箇所が残っていたことを確認 9 // 未対応だった構文の一例 // https://www.php.net/releases/8.3/ja.php#dynamic_class_constant_fetch <?php class MyClass { const BAR = 'bar'; } $bar = 'BAR'; echo MyClass::{$bar}; // PHP 8.3で追加された動的なクラス定数へのアクセスがPhan 5.4.5では未対応
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phanに対する継続性への不安 開発チームで使用していた静的解析ツールで直面した課題 • 2023年11月にPHP 8.3がリリースされてから1年半近くPhanがPHP 8.3 の構文に対応していなかった • 2024年8月にPhan
5.4.5が公開された後、目立ったコミットが2025年3月頃 まであまりない状況だった 10
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phanの代替としてPHPStanへの移行を検討 開発チームで使用していた静的解析ツールで直面した課題 • 常に最新のセキュリティ更新を取り込み続けるために今後も定期的にPHP をバージョンアップしていく必要がある • 将来予定されているPHP 9の破壊的変更に備えられる状態にしていきたい 11
静的解析ツールを変更しようとして 遭遇した問題 12
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて PHPStanへの移行で遭遇した問題 静的解析ツールを変更しようとして遭遇した問題 • 長い歴史の中で積み重なったコードとの互換性でつまづく • require_onceを多用している既存コードでたびたび誤検知が発生 • 解析速度もボトルネックに •
PHPスクリプトのソースコードだけでも120万行以上ある製品 • PHPStanを走らせるCIジョブの実行に30分近くかかることも 13
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 対応方法で悩んでいたところにPhanの状況に変化 静的解析ツールを変更しようとして遭遇した問題 • 見直しを進めている最中にPhanがアップデート • Phan 5.4.6が2025年6月9日にリリース • PHP
8.3とPHP 8.4の構文に対応 ➢ Phanを改めて再評価することに 14
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phan 5.4.6でも前回調査時と同様のエラーを観測 静的解析ツールを変更しようとして遭遇した問題 • 動的なクラス定数へのアクセスがPhan 5.4.6でも未対応 • 読み取り専用プロパティのディープクローンも誤検知する状態のまま 15
PHP 8.3以降ではreadonlyプロパティをクローンする際、__cloneメソッド内で一度だけプロパティを変更できるように
OSSへのコントリビューション事例と現状 16
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて サイボウズのOSSポリシー OSSへのコントリビューション事例と現状 • https://blog.cybozu.io/entry/oss-policy • 多くの企業で活用いただけるよう2018年にCC0(いかなる権利も保有しない、 いわゆるパブリックドメイン)で公開 • https://cybozu-oss-policy.readthedocs.io/ja/
• 社員がOSS関連活動を過大な負担なく行えるよう支援 • オープンソースコミュニティにおける良き一員であるために必要なことを規定 • 「他者 OSS の不具合を発見した場合、従業員は、速やかに当該不具合を報告 するよう努めるものとする」と明記 17
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 解決アプローチ:OSSへのコントリビューション OSSへのコントリビューション事例と現状 • 同じYukimiチームのメンバーがイシューを登録 • Dynamic class constant or
enum member access causes AssertionError: $constant_name must be a string : https://github.com/phan/phan/issues/4961 • Phan reports false positive for deep-cloning of readonly properties : https://github.com/phan/phan/issues/4962 • 同じYukimiチームのメンバーがプルリクエストを送付 • 動的なクラス定数へのアクセスに関するPR : https://github.com/phan/phan/pull/4963 • 触発されて自分もプルリクエストを送付 • 読み取り専用プロパティのディープクローンに関するPR : https://github.com/phan/phan/pull/4964 18
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Phan 5.5.0で問題が解決 OSSへのコントリビューション事例と現状 • 各プルリクエストがマージされて2025年6月末にPhan 5.5.0がリリース • 結果としてPhanで見つかった問題を自分たちで解決できた •
継続可能性と現実的な保守コストを踏まえ引き続きPhanを使う判断に • 反省点:最初の調査時に未対応箇所を確認した時点で報告すべきだった 19
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて OSSにコントリビュートしてよかったこと OSSへのコントリビューション事例と現状 • 独自にパッチを作る必要がなくなった • OSS活動を通して課題を解決する経験がチームでできた • チーム内でツール内部への理解が深まった •
結果として「Phanを継続利用できる」判断材料になった 20
今後に向けて注目しているMago 21
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Mago 今後に向けて注目しているMago • Rustで記述されたPHP向け開発支援ツール • 1つのバイナリで静的解析ツール(mago analyze)、リンター(mago lint)、 フォーマッター
(mago format)の役割を備える • 非常に高速 22 引用元 : https://mago.carthage.software/#benchmarks
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて Magoの現況 今後に向けて注目しているMago • 開発が活発 • 2024年12月にMago 0.0.1がリリース • 2025年12月にMago
1.0.0がリリース • 頻繁にリリースされていて2026年5月9日現在の最新バージョンは1.26.0 • 対応も迅速 • イシューを登録するとすぐに対応してくれた 23
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 個人的にMagoに注目している理由 今後に向けて注目しているMago • 高速なので大規模コードベースでも実用的に使える可能性がある • 120万行以上あるコードに対して試しに実行したところ約30秒で解析が完了 • ただし、mago lintで検出されるルールがmago
analyzeに実装されていない ものもあったりする状況 • 今すぐ全面移行はせず将来の移行候補もしくはPhanを補完するツールとして 検証中 24
巨大で歴史あるコードベースでの 静的解析ツールの使い方と今後の展望 25
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 現時点ではPhanを継続利用することに 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • 評価基準は「現場で使い続けられるか」 26 観点 Phan PHPStan Mago
PHP新バージョンへの追従 ◦ バージョン5.5.0以降で改善 (バージョン6.0.0でPHP 8.5に も対応) ◎ 将来追従への安心感がある ◦ 活発に開発中(2025年12月 にバージョン1.0.0がリリースさ れたばかり) 既存コードとの相性 ◎ 歴史ある現行コードに馴染む △ require_onceを多用するコー ドで課題 △ 要検証 実行速度 ◦ 実運用可能 △ CIで30分近くかかることも ◎ 120万行超でも30秒以内 総合判断 継続利用 補助的に利用 実際に使えるかこれから検証
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 得た学び 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • OSSは「使うだけ」の対象ではなく「一緒に育てる」対象にもなる • 巨大で歴史あるコードベースでは互換性、保守コストそして速度が重要 • 既存のコードベースに対する深い理解と継続的な改善も大事 27
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 巨大で歴史あるコードベースでの静的解析ルールの使い方 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • 静的解析のルールは自動的に少しずつ強くする • ルールを強められる場合には自動的に少しずつ強くする • 既存コードの問題は無視したまま、新規作成されたファイルでは強いルールで 静的解析を行う
• PHPのバージョンアップで影響を受ける箇所を適宜把握してリスクが高く 修正コストが低いところから静的解析で検知した問題に順次対応していく ➢ 重要なのは「いきなり理想の静的解析ルールを適用すること」ではなく 「継続して改善しながら運用していけること」 28
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 今後の展望:役割を絞ってMagoを補助的に使ってみることを検討中 巨大で歴史あるコードベースでの静的解析ツールの使い方と今後の展望 • 1つのツールだけに依存していると見逃している問題があるかもしれない • Phanをメインで使いつつMagoを次の用途で補助的に使い始めてみたい (今すぐ全面移行はせず将来の移行候補として) • 複数のツールを使って見逃しを減らす
• ベースラインで隠れている問題を別観点でチェックする • すでに直した種類の問題が再発していないか確認する 29
まとめ 30
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて まとめ まとめ • PHPの変化に追従および備える上で静的解析は役に立つ • 巨大で歴史あるコードベースでは互換性、保守コストそして速度が重要 • 問題はOSSへのコントリビューションで解決できる場合もある •
既存のツールを使いつつ新しいツールも検証しながら併用していきたい ➢ 皆さんもOSSへのコントリビューションに取り組んでみませんか 31
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて 関連リンク 付録 • Cybozu Inside Out | サイボウズエンジニアのブログ https://blog.cybozu.io/
• (日本語訳) Migrating Garoon codebase to PHP 7 • https://blog.cybozu.io/entry/2017/10/16/080000 • CircleCIで勝手に強くなる静的解析の作り方 • https://blog.cybozu.io/entry/2020/07/08/080000 • OSS初心者のコントリビュート - 業務で困ったPhanの問題を解決してみた • https://blog.cybozu.io/entry/2025/10/06/113000 32
©️ Cybozu, Inc. 33