Page 1
5分でわかるPHPの型システム
Introducing PHP's type system in 5 minutes
にゃんだーすわん @tadsan / USAMI Kenta うさみけんた
公開日:
by USAMI Kenta @tadsan
にオンラインのYouTube Liveで開催された『TechFeed Conference 2022』でライトニングトーク(5分)として発表しました。
5分でわかるPHPの型システム
Introducing PHP's type system in 5 minutes
にゃんだーすわん @tadsan / USAMI Kenta うさみけんた
お前誰よ
ヾ(〃><)ノ゙
PHPは簡単な言語だから
上級テクニックなんてないよ笑
PHPは簡単な言語だから
上級テクニックなんてないよ笑 言語が簡単なので素朴に書くとエントロピーが無限に増大する
PHPの型にどのような 印象を持っていますか?
脆弱性 ゆるふわ 弱い型 動的
クソザコ 型なし 意味不明 弱い 自動変換 貧弱 Perlっぽい 適当
PHPについてのパブリックイメージ
脆弱性 ゆるふわ 弱い型 動的
?
クソザコ 型なし 意味不明 弱い 自動変換 貧弱 Perlっぽい 適当
PHPについての認識は概ね間違い
PHPの値は型タグと共用体の
組に過ぎませんが何か?
https://github.com/php/php-src/blob/php-8.1.0/Zend/zend_types.h
https://github.com/php/php-src/blob/php-8.1.0/Zend/zend_types.h
PHPの値は型タグと共用体の
組に過ぎませんが何か?
過言です
極論はさておいてPHP
ランタイムの型はこれだけ
言語処理系の内部実装について 「Rubyソースコード完全解説」
が参考になる
bool int float string
array object null
resource
(callable iterable mixed)
JSONで扱える型 + 特殊な型がある
無限の可能性を持つ
array
Pythonでのlist/dict
RubyのArray/Hashを併せ持つ
ユニオン型
A|B
AまたはB
(複雑な式は書けない)
交叉型
A&B
AおよびB
(複雑な式は書けない)
null許容型
?
A
Aまたはnull
デフォルトで許容しない
謎のPHP用語
mixed
いわゆるany
(PHPマニュアルの記述に由来)
型宣言できない特殊型
resource
ファイルポインタなど
(徐々にobjectに置き換え)
型はランタイムに 確実に保証される
整数ではない文字列は
型宣言通りに変換
整数ではない文字列は
TypeErrorになる
ファイル単位で
strict_types=1指定で
自動変換を抑制
どちらにせよ受け取った
関数の側ではintであることが
保証される
PHPでは実行時に
型情報がとれる
ユニオン型宣言で 適切に変換される
classとinterfaceを
ユーザー定義型として利用可能
型宣言にクラス名を指定できる
インターフェイスも指定できる
void型宣言で戻り値を
返さないことを明示できる
= その関数には副作用がある
never型宣言でメソッドが 正常終了しないことを宣言
= 異常状態が後続に漏れない
WSGI/Rack/PSGI相当のWeb
アプリケーションのI/Fも
型宣言ベースで定義されている
MIT License - Copyright (c) 2018 PHP-FIG
https://github.com/php-fig/http-factory/blob/1.0.1/src/ResponseFactoryInterface.php
型はランタイムに 確実に保証される
それはわかった
型が実行時に保証される点で
PHPは他の動的言語とは 一線を画しているといえる
要するにPHPは
statically typed
静的型付き…ってコト!?
型なしはどこから来るの?
動的言語を型なしと呼ぶのも
別に誹謗中傷というわけではない
PHPではURLクエリを
グローバル変数から取り出せる
いろんなところから湧き出す
型の特定できないデータ
arrayは無限の可能性を秘める
(悪い意味で)
扱う対象が複数になったのに
型に反映されない
PHPの組み込みの型機能では
どんなに型推論しても 静的に型が定まらない
arrayの中に何が
入ってるのかわからん
https://www.php.net/array_map
几帳面に型宣言だけを追うと
人間にはわかる型も機械は理解できない
無限の可能性を秘めたarrayを
放置するとコード全体の
エントロピーが増大し
プロジェクトは熱的死を迎える
ランタイムに保証
されない型を書こう
https://phpstan.org/
http://psalm.dev/
https://www.jetbrains.com/ja-jp/phpstorm/
/** */ のブロックに型を書く
array-shapes
array{key: type} で構造体
のような型を記述できる
array<key, value>
array<T>
list<value> のように型を書ける
型パラメータで戻り値を
@template
可変にできる
ツール互換性のために
@template
@phpstan- を付けてもよい
アプリケーションの
エントロピーを減少させて
快適に開発しよう