Slide 1

Slide 1 text

PHPの型システムで 言ってることがわからない スー

Slide 2

Slide 2 text

自己紹介 テックリード / Suguru Ohki スー TechTrainのエンジニア1人目。 技術を反復横跳びしていますが、前より抑えられています・・・! 趣味: サウナ、お酒

Slide 3

Slide 3 text

01 PHP公式ドキュメント における型システム

Slide 4

Slide 4 text

皆さんもこの説明見たことありますよね・・・?

Slide 5

Slide 5 text

採用アルゴリズム 部分型の関係を満たしつつ (behavi ral subtypi ng) 名前ベースで一致を調べる型システム (nomi nal type system)

Slide 6

Slide 6 text

採用アルゴリズム 部分型の関係を満たしつつ (behavi ral subtypi ng) 名前ベースで一致を調べる型システム (nomi nal type system) わ か ら ん

Slide 7

Slide 7 text

02 部分型の関係 (behaviral subtyping)

Slide 8

Slide 8 text

behavi ral subtypi ng サブタイプ(派生クラス)は、そのスーパータイプ(基底ク ラス)の代わりに使用できるべきである。 1 . サブタイプは、スーパータイプの振る舞い(メソッドの契約) を維持しなければならない。 2 . サブタイプは、スーパータイプの事前条件を強化してはなら ず、事後条件を弱めてはならない。 3 .

Slide 9

Slide 9 text

behavi ral subtypi ng

Slide 10

Slide 10 text

behavi ral subtypi ng

Slide 11

Slide 11 text

behavi ral subtypi ng

Slide 12

Slide 12 text

behavi ral subtypi ng Square は Rectangle のサブタイプであり、Rectangle が 使用できる場所で Square も使用できます。 1 . Square は Rectangle の振る舞いを維持しています (getArea() メソッドの契約を守っています) 。 2 . printArea() 関数は、Shape インターフェースを実装した 任意のオブジェクトで動作します。 3 .

Slide 13

Slide 13 text

03 名前ベースで一致を調べる型 システム (nominal type system)

Slide 14

Slide 14 text

名前的 or 構造的の2つがある Nomi nal type system 1 . Structural Typi ng 2 .

Slide 15

Slide 15 text

名前的 or 構造的 1.Nominal type system FooとBarの名前が異なる →エラーとなる

Slide 16

Slide 16 text

名前的 or 構造的 2. Structural Typing FooとBarの構造が同じ →エラーとならない

Slide 17

Slide 17 text

ご清聴ありがとう ございました! 時間があれば、余談に続く

Slide 18

Slide 18 text

07 余談: 明日話す型システム も含む余談。

Slide 19

Slide 19 text

余談1: Gener i cs Generics 1 . 言語に取り入れるRFCが実はあるが、動いてない a. https://wiki.php.net/rfc/generics (Draft) i . https://github.com/PHPGenerics/php- generics-rfc/issues/45 ii . https://github.com/nikic/php-src/pull/3 iii . phpstanやmrsuh/php-genericsといったライブラリで 現在は取り入れられていることが多いですよね! b. 2 .

Slide 20

Slide 20 text

余談2: まだまだPHPの型の怪しいところ 型の相互変換(TypeJuggling) 型の機能自体が 値の型そのものを見ているわけではなく、 値の内容が目的の型に変換できるかどうかでみている a. 受け入れられると型変換されると言った性質を持つ部分が あるため、このようなことが結構おきる b. 日本に来てGina Peter Banyard(Girgias)さんがLTをし てくださった際にもTypeJugglingには言及されていて、 安全に型が使えるようにRFCを出してくださることが多い c . swisskyrepo/PayloadsAllTheThings にも例がある d.

Slide 21

Slide 21 text

余談3: 実はt ypeに優先順位がある え?typeに優先順位なんてあんの?と思いましたw

Slide 22

Slide 22 text

余談4: 型システムを調査で便利だったもの 調査の時に全くわからない分野だったので、色々使ったりしたの ですが、本日リリースされたClaudeが一番わかりやすく、詳細 な調査結果を的確に出力していました。 ChatGPTよりも体験と精度はこの分野においては良かったの で、試してみると良いかなと思いました!