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