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分)として発表しました。
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ページはいつ「変化」するか
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
フロントエンドアプリケーション
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
フロントエンドアプリケーション
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
フロントエンドアプリケーション
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーサイドアプリケーション
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration↑ 静的ホスティングサーバー(GitHub Pages, PHP/CGI非対応レンタルサーバ, HTTPサーバ単体)
ブラウザ画面上で変化しないブラウザ画面上で変化する
↓ 動的サイトアプリケーションサーバ (PHP, Node.js, Go, Railsなど…)
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーサイド単体で扱えるのはここ
↓ 動的サイトアプリケーションサーバ (PHP, Node.js, Go, Railsなど…)
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
ここの裏側にもPHP APIがいるサーバーサイド単体で扱えるのはここ
↓ 動的サイトアプリケーションサーバ (PHP, Node.js, Go, Railsなど…)
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
Next.jsのようなフレームワークはこれに特化している
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
Vercel, AmplifyなどのPaaS
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ
静的ページ(SSG/静的サイト生成)
シングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ hydration Next.jsは静的サイト開発にも使える
Webアプリケーションの静と動
近年では外部サービス(mBaaS/IDaaS)に依存することもできる
ブラウザ画面上で変化しないブラウザ画面上で変化する
サーバーが返す内容は常に同じ静的ページシングルページアプリケーション
サーバーサイドレンダリング
サーバーが返す内容は変わることがある
サーバーサイドテンプレートエンジン
+ 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 7.x
安全性を落とさず本質的な実装に集中できる
コーディングしながら即座に間違いに気付きたい
コーディングしながら即座に間違いに気付きたい
コーディングしながら即座に間違いに気付きたい
PHPUnitと同じようにCIで使うもの…
と考えてもいいが、まずは小さく使ってほしい
インストラクションPHPStanを使い倒せ
PHPStanは毎秒起動せよ
テキストエディタに組み込みましょう
おそらくSanderRondeがいちばんよくできてる
おそらくSanderRondeがいちばんよくできてる
常時ペアプロ相手になってくれてるようなもの
PHPStanの基本機能を使えるようになろう
無限の可能性を認識可能な範囲内に縮めるのが型
実行しなくてもわかること= 静的に確認したい
実行して確かめたいこと= PHPUnit
どちらかではなく両輪
PHPStanが変だなと思ったら
