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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Atsushi Matsuo
May 09, 2026
Programming
240
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
61
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
900
個人的に嬉しかった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
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
250
Java 27新機能 / Java 27 new features
kishida
2
150
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
690
Building an Out-of-Order CPU
latte72
1
780
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
590
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
SREの越境 / SRE Collaboration
y0hgi
2
210
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
1.3k
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
270
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
300
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
130
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
Deep Space Network (abreviated)
tonyrice
0
310
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
New Earth Scene 8
popppiees
4
2.6k
Chasing Engaging Ingredients in Design
codingconduct
0
310
From π to Pie charts
rasagy
1
370
The Cult of Friendly URLs
andyhume
79
7k
Bash Introduction
62gerente
615
220k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Product Roadmaps are Hard
iamctodd
55
13k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
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