Page 1
なぜPHPに型がつくのか
All Your PHP Code Are Typed by Us
pixiv Inc.
USAMI Kenta
2025-12-13 #TechGyoza小山市立 生涯学習センター ギャラリー
公開日:
by USAMI Kenta@tadsan
に栃木県小山市の小山市立 生涯学習センター ギャラリーで開催された『TechGYOZA 2025』でライトニングトーク(5分)として発表しました。
2025-12-13 #TechGyoza小山市立 生涯学習センター ギャラリー
お前誰よ
PHPcon新潟
PHPcon広島
TechRAMEN
PHPcon新潟
PHPcon広島
趣味はプログラミング言語
特に動的言語/スクリプト言語が好き
動的言語には無限の可能性()があります
2000年代は動的言語が大活躍した時代
重厚なIDE…長大なコンパイル時間…
スクリプト言語はシンプルなエディタで簡単に書ける!
2000年前後CGIで簡単にWebアプリが書ける
2010年前後Railsで高機能なものが簡単に書ける
アプリケーションが大規模に「育つ」と収拾がつかなくなってくる
メソッドの実装をわざわざ探してコードを読まなければ引数の種類すらわからん
202x年世界は型の炎に包まれた!
JavaScript
↓
JavaScript
↓TypeScript
Python
↓
Python
↓typing module
Ruby
↓
Ruby
↓Inline RBS
海は枯れ、地は裂け、全ての型なしが死滅したかのように見えた
だが、PHPは死滅していなかった!
世紀末救世主伝説
<?php
誰でも簡単にホームページが作れるゆるふわ言語
PHPについてのパブリックイメージ
脆弱性 ゆるふわ 弱い型 動的クソザコ 型なし 意味不明 弱い自動変換 貧弱 Perlっぽい 適当
PHPについての認識は概ね間違い
脆弱性 ゆるふわ 弱い型 動的クソザコ 型なし 意味不明 弱い自動変換 貧弱 Perlっぽい 適当
認識を揃えておきましょう
動的言語/スクリプト言語
言語としてのPHP
動的言語でも型を書くことが広まってきた
ドキュメントとしての型
function add($a, $b) {return $a + $b;}
/*** @param int $a* @param int $b* @return int|float*/
function add($a, $b) {return $a + $b;}
宣言の構文内にも型を書けるようになった
function add(int $a, int $b): int|float{return $a + $b;}
関数に入出力の型を書いておくことで影響を想像しやすく
ここまでは人間が型を付ける(書く)話
/*** @param int $a* @param int $b* @return int|float*/function add($a, $b) {return $a + $b;}
DocCommentとかいう机上の空論
/*** @param int $a* @param int $b* @return int|float*/function add($a, $b) {return $a + $b;}
DocCommentとかいう机上の空論
コーディング時のヒントとして役に立つ…かもしれない
/*** @param int $a* @param int $b* @return int|float*/function add($a, $b) {return $a + $b;}
function add(int $a, int $b): int|float{return $a + $b;}
intしか渡されないことは実行時に保証される
function add(int $a, int $b): int|float{return $a + $b;}
intしか渡されないことは実行時に保証される
型宣言に反する値が返されたら実行時エラー
実際には型宣言をもとに型を再構築する
PHP
$a = 1;$b = 2;$c = $a + $b;
PHP
C言語
$a = 1;$b = 2;$c = $a + $b;
int a = 1;int b = 2;int c = a + b;
PHP
$a = 1;$b = 2;$c = $a + $b;
PHP
int
PHP
int
int
PHP
int
int
int
PHPでは処理系の外で静的型チェッカーの文明が広がった
型チェッカー
$a = 1;$b = 2;$c = $a + $b;
型チェッカー
int(1)
型チェッカー
int(1)
int(2)
型チェッカー
int(1)
int(2)
int(3)
型チェッカー
$a = ‘foo’;$b = rand() === 1 ? ‘foo’ : ‘bar’;$c = $a + $b;
'foo'型チェッカー
型チェッカー
'foo''foo'
型チェッカー
'foo''foo''bar'
型チェッカー
'foo''foo''bar'
型チェッカー
'foo''foo''bar'
'foo'|'bar'
型チェッカー
'foo''foo'
'bar'
'foo'|'bar'
'foofoo'|'foobar'
PHPの組み込みの型機能ではどんなに型推論しても静的に型が定まらない
無限の可能性を秘めたarrayを放置するとコード全体のエントロピーが増大しプロジェクトは熱的死を迎える
現実には外部のライブラリで型が書かれていないこともある
ライブラリの型をメンテナンスされているものもある
実装と一致した型がきちんと書かれていることが多い
そんなに動的言語を書きたいか
静的型付きと動的の良いとこどりができるゆるふわ言語PHPにこれからもご期待ください
関連リンクがありません。
