Skip to content

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{key: type} で構造体のような型を記述できる

array-shapes

Page 53

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

array<T>

Page 54

型パラメータで戻り値を可変にできる

@template

Page 55

ツール互換性のために@phpstan- を付けてもよい

@template

Page 56

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