Page 1
なんでいま静的解析なの?
PHPで学ぶ「静」と「動」
Why Static Analysis Now? Exploring “Static” and “Dynamic” in PHP
pixiv Inc.
USAMI Kenta
2025-10-11 #phpcon_hiroshima
PHPカンファレンス広島2025
公開日:
by USAMI Kenta @tadsan
に広島市南区のエールエールA館で開催された『PHPカンファレンス広島2025』でレギュラーセッション(20分)として発表しました。
なんでいま静的解析なの?
PHPで学ぶ「静」と「動」
Why Static Analysis Now? Exploring “Static” and “Dynamic” in PHP
pixiv Inc.
USAMI Kenta
2025-10-11 #phpcon_hiroshima
PHPカンファレンス広島2025
お前誰よ
今回のお題
static dynamic
プログラミングを
やっていると
ちょくちょく出てくる
static
dynamic
static
静
dynamic
static
静
dynamic
動
静とは 🧘
引用:
英辞郎 on the WEB, 株式会社アルク, EDP
https://eowf.alc.co.jp/search?q=static
https://eowf.alc.co.jp/search?q=dynamic
(2025年10月11日 閲覧)
引用:
英辞郎 on the WEB, 株式会社アルク, EDP
https://eowf.alc.co.jp/search?q=static
https://eowf.alc.co.jp/search?q=dynamic
(2025年10月11日 閲覧)
引用:
英辞郎 on the WEB, 株式会社アルク, EDP
https://eowf.alc.co.jp/search?q=static
https://eowf.alc.co.jp/search?q=dynamic
(2025年10月11日 閲覧)
引用:
英辞郎 on the WEB, 株式会社アルク, EDP
https://eowf.alc.co.jp/search?q=static
https://eowf.alc.co.jp/search?q=dynamic
(2025年10月11日 閲覧)
動とは 🏃
引用: dynamic - Wiktionary, the free dictionary (2025年8月12日 10:33版)
活動・動いている
引用: dynamic - Wiktionary, the free dictionary (2025年8月12日 10:33版)
活動・動いている
力強い・
エネルギッシュ
引用: dynamic - Wiktionary, the free dictionary (2025年8月12日 10:33版)
活動・動いている
力強い・
エネルギッシュ
変化・適応できる
引用: dynamic - Wiktionary, the free dictionary (2025年8月12日 10:33版)
活動・動いている
力強い・
エネルギッシュ
変化・適応できる
コンパイル時ではなく、
実行時に起こる
引用: dynamic - Wiktionary, the free dictionary (2025年8月12日 10:33版)
Webにおける静と動
🌐
Webページはいつ「変化」するか
整理してみましょう
Webページはどこで「変化」するか
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Webページはどこで「変化」するか
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Webページはどこで「変化」するか
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Webページはどこで「変化」するか
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Webページはどこで「変化」するか
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Webアプリケーション分類
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Webアプリケーション分類
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
フロントエンド
Webアプリケーション分類
アプリケーション
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
フロントエンド
Webアプリケーション分類
アプリケーション
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
フロントエンド
Webアプリケーション分類
アプリケーション
サーバーサイド
ブラウザ画面上で変化しない ブラウザ画面上で変化する
アプリケーション
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静的ホスティング vs Webアプリ
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
↑ 静的ホスティングサーバー
内容は変わることがある テンプレートエンジン + hydration
(GitHub Pages, PHP/CGI非対応レンタルサーバ, HTTPサーバ単体)
動的Webサーバ
(PHP)
ブラウザ画面上で変化しない ブラウザ画面上で変化する
↓ 動的サイト
サーバーが返す シングルページ
静的ページ
アプリケーションサーバ (PHP, Node.js, Go, Railsなど…)
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
動的Webサーバ
(PHP)
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーサイド単体で
扱えるのはここ
↓ 動的サイト
サーバーが返す シングルページ
静的ページ
アプリケーションサーバ (PHP, Node.js, Go, Railsなど…)
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
動的Webサーバ
(PHP)
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーサイド単体で ここの裏側にも
扱えるのはここ PHP APIがいる
↓ 動的サイト
サーバーが返す シングルページ
静的ページ
アプリケーションサーバ (PHP, Node.js, Go, Railsなど…)
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Webアプリ vs Next.js
(SSR)
ブラウザ画面上で変化しない ブラウザ画面上で変化する
Next.jsのようなフレームワークは
サーバーが返す シングルページ
静的ページ
これに特化している
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
Vercel, AmplifyなどのPaaS
内容は変わることがある テンプレートエンジン + hydration
Webアプリ vs Next.js
(SSG/SPA)
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す 静的ページ シングルページ 内容は常に同じ (SSG/静的サイト生成) アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
Next.jsは静的サイト開発にも使える
内容は変わることがある テンプレートエンジン + hydration
Webアプリケーションの静と動
静と動の境界を「ずらす」
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
計算コストが重い
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
計算コストが重い
内容は常に同じ アプリケーション
キャッシュ
(CDN/キャッシュサーバ)
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
セッション依存(ログイン後) ページはキャッシュできない
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
計算コストが重い
内容は常に同じ アプリケーション
キャッシュ
(CDN/キャッシュサーバ)
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
セッション依存(ログイン後) ページはキャッシュできない
適切にキャッシュ破棄できないと
古いコンテンツが残り続ける
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
計算コストが重い
内容は常に同じ アプリケーション
キャッシュ
(CDN/キャッシュサーバ)
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
SEOが弱い
(クローリングが遅い)
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
SEOが弱い
(クローリングが遅い)
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
ダイナミックレンダリング
(Rendertron)
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
SEOが弱い
(クローリングが遅い)
いろんな意味で
運用だいぶつらい
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
ダイナミックレンダリング
(Rendertron)
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
静と動の境界を「ずらす」
SEOが弱い
(クローリングが遅い)
いろんな意味で
運用だいぶつらい
ブラウザ画面上で変化しない ブラウザ画面上で変化する
サーバーが返す シングルページ
静的ページ
内容は常に同じ アプリケーション
ダイナミックレンダリング
(Rendertron)
サーバーが返す サーバーサイド サーバーサイドレンダリング
内容は変わることがある テンプレートエンジン + hydration
Next.js移行
静と動 🧘🏃
動くものと
変わらぬものがある
開発における静と動
🛠
プログラムにも
静と動がある
引用: PHP (プログラミング言語) - Wikipedia (2025年6月22日 14:23版)
引用: PHP (プログラミング言語) - Wikipedia (2025年6月22日 14:23版)
引用: PHP (プログラミング言語) - Wikipedia (2025年6月22日 14:23版)
引用: C言語 - Wikipedia (2025年9月16日 22:41版)
引用: Java - Wikipedia (2025年9月24日 16:18版)
静的型付き
言語
(statically typed language)
動的言語
(dynamic language)
無限の彼方へ さあ行くぞ!
🚀🚀🚀
無限とか言われても困る
😵💫
品質管理 vs 俺たち
PHP vs 型付け
PHP 5.x
PHP 5.x PHP 7.x
PHP 5.x PHP 7.x
安全性を落とさず
本質的な実装に集中できる
コーディングしながら
即座に間違いに気付きたい
コーディングしながら
即座に間違いに気付きたい
コーディングしながら
即座に間違いに気付きたい
PHPStan
PHPUnitと
同じようにCIで
使うもの…
と考えてもいいが、
まずは小さく 使ってほしい
インストラクション
PHPStanを使い倒せ
PHPStanは 毎秒起動せよ
……どうやって?
テキストエディタに
組み込みましょう
PhpStormで簡単に有効化
VS Codeの場合
おそらくSanderRondeが
いちばんよくできてる
VS Codeの場合
おそらくSanderRondeが
いちばんよくできてる
Emacsは私が作っています
常時ペアプロ相手に
なってくれてる
ようなもの
\PHPStan\dumpType()
PHPStanの
基本機能を使える
ようになろう
無限の可能性を
認識可能な範囲内に
縮めるのが型
実行しなくても
わかること
= 静的に確認したい
実行して
確かめたいこと
= PHPUnit
静と動
静的解析とテスト
どちらかではなく
両輪
PHPStanが
変だなと思ったら
phpusers-ja Slack
続きはWebで