Page 1
PHPの「型」は
どこまで戦えるか
Can PHP Types Still Compete?
Pushing the Limits of Static Analysis.
pixiv Inc.
USAMI Kenta
2026-10-03 #phpcon_ehime PHPカンファレンス愛媛 @愛媛大学 城北キャンパス
公開日:
by USAMI Kenta@tadsan
に愛媛県松山市の愛媛大学 城北キャンパスで開催された『PHPカンファレンス愛媛2026』でレギュラートーク(20分)として発表しました。
2026-10-03 #phpcon_ehime PHPカンファレンス愛媛 @愛媛大学 城北キャンパス
みなさまはPHPの無限の可能性が好きですか?
PHPの型についての質問で正しいものは?(全4問)
1. PHPは型なし言語である
2. PHPには型宣言がある
3. PHPに書く型は実行時に保証されない
4. PHPは静的型付きである
正しいものは? (複数回答可能)
1. PHPは型なし言語である2. PHPには型宣言がある3. PHPに書く型は実行時に保証されない4. PHPは静的型付きである
お前誰よ
型がついている#とは
型推論規則に従ってすべての項に矛盾なく型が割り当てられた状態
…ですが何か?
覚えておいてほしい用語
型チェッカー
$a = 3;$b = 2;$c = pow($a, $b);
型チェッカー
int
型チェッカー
int
int
型チェッカー
int
int
引数ok
型チェッカー
int
int
引数ok
引数ok
型チェッカー
int
int
引数ok
引数ok
int
分類するのが型付け(typing)。型を明示しなくても項の種類を特定する具体的な手続きが型推論(type inference)。
便宜的に動的型付け(dynamic typing)と呼ぶこともある
「型付き(typed)」と呼ぶ
1. PHPは型なし言語である2. PHPには型宣言がある3. PHPに書く型は実行時に保証されない4. PHPは静的型付きである
静的解析が通れば実行時に(型に関する)エラーは起こらないという性質
いわゆる「型安全」(type safety)
るようになっていることを表わしている
言語が静的か動的かとは[独自研究]
ことが前提になっている言語が静的(型付き)
1. PHPは型なし言語である2. PHPには型宣言がある3. PHPに書く型は実行時に保証されない4. PHPは静的型付きである
正当なプログラム(構文木)として受理される → 実行時エラー
実行時のインタプリタの振る舞い
PHPインタプリタは型なしである
1. PHPは型なし言語である2. PHPには型宣言がある3. PHPに書く型は実行時に保証されない4. PHPは静的型付きである
PHPと型宣言
function add($a, $b) {return $a + $b;}
function add(int $a, int $b): int {return $a + $b;}
int + intって本当にintなの?
function add(int $a, int $b): int {return $a + $b;}
function add(float $a, float $b): float {return $a + $b;}
ひとつの解決策ではあるが… 不必要にfloatを強制するのか
function add(float $a, float $b): float {return $a + $b;}
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
あえて型宣言を省略する
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
function add(int|float $a, int|float $b): int|float {return $a + $b;}
型宣言された型は口約束ではなく実効性がある
型理論としては型なしだががんばって動作確認するなら実用上ほぼ型付きと認められなくもなくなってきた
1. PHPは型なし言語である2. PHPには型宣言がある3. PHPに書く型は実行時に保証されない4. PHPは静的型付きである
PHPDocに型を書く文化もある
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
あえて型宣言を省略する
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
型宣言にarrayとしか書かないと
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<int>
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<int>
array<int,string>
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<int>
array<int,string>
array{id:int, name:string}
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<int>
array<int,string>
array{id:int, name:string}
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<array{id:int, name:string}>
1. PHPは型なし言語である2. PHPには型宣言がある3. PHPに書く型は実行時に保証されない4. PHPは静的型付きである
PHPの組み込みの型機能ではどんなに型推論しても静的に型が定まらない
無限の可能性を秘めたarrayを放置するとコード全体のエントロピーが増大しプロジェクトは熱的死を迎える
型チェックをしたとしても実用的な推論結果にならない(こともある)
PHPStan
$a = ‘foo’;$b = rand() === 1 ? ‘foo’ : ‘bar’;$c = $a + $b;
'foo'PHPStan
PHPStan
'foo''foo'
PHPStan
'foo''foo''bar'
PHPStan
'foo''foo''bar'
PHPStan
'foo''foo''bar'
'foo'|'bar'
PHPStan
'foo''foo'
'bar'
'foo'|'bar'
'foofoo'|'foobar'
PHPStan
$a = 1;$b = 2;$c = $a + $b;
PHPStan
int(1)
PHPStan
int(1)
int(2)
PHPStan
int(1)
int(2)
int(3)
型チェッカー
$json = $_POST['json'];$a = json_decode($json);var_dump($a[‘name']);
mixed型チェッカー
mixed
string欲しいんだけど…型チェッカー
mixed
string欲しいんだけど…型チェッカー
?array|int|float|string|bool
mixed
string欲しいんだけど…型チェッカー
?array|int|float|string|boolこのキーあるの…?
そのため動的言語ではテストの重要性が高かった
型は「ありうる」状態を記述する言語
適切に推論できればテストを書くまでもなく変なコードが炙りだせる
パラメータを厳しくするより戻り値を適切に
戻り値が適切に記述されていれば呼び出し側で型をつける必要はない
PHPStanは普通にコードを書いて警告が増加しないレベルが適正
複雑な型を書きまくるのが型付けではない
PHPコードの@returnが足りていない
💡型を書きまくるSKILLを書こう
特にarray-shapeを書きまくる必要が生じる
そこからレベルを上げるには拡張で解決したい
たぶんあんまりよくない
理屈上は任意の項に型をつけられる
お使いのAIさんと相談しながらサクっと作れる時代になった
LLMにとってプログラミング言語と人間の言語は同列
流暢なコードは効率よく処理しやすい
エントロピーを下げて人とAIに優しい予測可能なコードを育てよう
正しいものは? (複数回答可能)
1. PHPは型なし言語である2. PHPには型宣言がある3. PHPに書く型は実行時に保証されない4. PHPは静的型付きである
正しいものは? (複数回答可能)
✅ PHPは型なし言語である
✅ PHPには型宣言がある
✅ PHPに書く型は実行時に保証されない
✅ PHPは静的型付きである
考え方によってはすべて正しい
AI時代にPHPを使うメンタルモデルについては香川で話した
今度新潟ではちょっと違う形の話をします
