5分でわかるPHPの型システム

公開日:

オンラインYouTube Liveで開催された『TechFeed Conference 2022』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

5分でわかるPHPの型システム

Introducing PHP's type system in 5 minutes

にゃんだーすわん @tadsan / USAMI Kenta うさみけんた

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-shapes

array{key: type} で構造体
のような型を記述できる

Page 53

array<key, value>

array<T>

list<value> のように型を書ける

Page 54

型パラメータで戻り値を

@template

可変にできる

Page 55

ツール互換性のために

@template

@phpstan- を付けてもよい

Page 56

アプリケーションの
エントロピーを減少させて
快適に開発しよう