Slide 1

Slide 1 text

Copyright© M&Aクラウド PHP8.2にバージョンアップして もっと型表現を豊かにしよう PHPカンファレンス沖縄2023 Akito.Tsukahara

Slide 2

Slide 2 text

Copyright© M&Aクラウド 2 ⾃⼰紹介 塚原彰仁 AkitoTsukahara 株式会社M&Aクラウド AkitoTsukahara akito_tsukahara

Slide 3

Slide 3 text

Copyright© M&Aクラウド この発表でお話しすることは? 今⽇話すこと ● PHP8.2で新しくできること ● 型表現を豊かにしてみよう ● バージョンアップしてみた ● まとめ

Slide 4

Slide 4 text

Copyright© M&Aクラウド PHP8.2で新しくできること PHP8.2 ● 2022/12/08にPHP8.2がリリース🎉

Slide 5

Slide 5 text

Copyright© M&Aクラウド PHP8.2で新しくできること 新機能💡 ● true/false/nullが独⽴した型で利⽤可能に function alwaysTrue(): true { return true; } function alwaysFalse(): false { return true; } function alwaysNull(): null { return null; } function alwaysTrue(): bool { return true; } function alwaysFalse(): bool { return true; } function alwaysNull(): ?string //静的解析でエラー { return null; } PHP8.2~ ~PHP8.1

Slide 6

Slide 6 text

Copyright© M&Aクラウド PHP8.2で新しくできること 新機能💡 ● 選⾔標準形 (Disjunctive Normal Form) 型が使えるように public function bar((A&B)|null $entity) { return $entity; } public function bar(mixed $entity) { if ( (($entity instanceof A) && ($entity instanceof B)) || ($entity === null) ) { return $entity; } throw new Exception('Invalid entity'); } PHP8.2~ ~PHP8.1

Slide 7

Slide 7 text

Copyright© M&Aクラウド PHP8.2で新しくできること 新機能💡 ● クラスにreadonlyを指定することができるように readonly class OkinawaIsland { public function __construct( public string $name, public int $population, public int $area, ) { } } class OkinawaIsland { public function __construct( public readonly string $name, public readonly int $population, public readonly int $area, ) { } } PHP8.2~ ~PHP8.1

Slide 8

Slide 8 text

Copyright© M&Aクラウド PHP8.2で新しくできること 新機能💡 ● バックトレースにおけるセンシティブなパラメータの出⼒抑制ができる function getUser( $name, $email, #[SensitiveParameter] $password ) { throw new Exception('Error'); } getUser('taro', '[email protected]', 'taropass'); function getUser( $name, $email, #[SensitiveParameter] $password ) { throw new Exception('Error'); } getUser('taro', '[email protected]', 'taropass'); PHP8.2~ ~PHP8.1

Slide 9

Slide 9 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう 9

Slide 10

Slide 10 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その1 Nullオブジェクトパターンで使う👻 readonly class Speaker { public function __construct( private Name $name, private Email $email, private XAccountInterface $xAccount, ){} public function toArray(): array { return [ 'name' => $this->name->getValue(), 'email' => $this->email->getValue(), 'x_account' => $this->xAccount->isUndefined() ? null : $this->xAccount->getValue(), ]; } } Speaker.php

Slide 11

Slide 11 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう interface Undefinedable { public function isDefined(): bool; public function isUndefined(): bool; } その1 Nullオブジェクトパターンで使う👻 Undefinedable.php interface XAccountInterface extends Undefinedable { } XAccountInterface.php

Slide 12

Slide 12 text

Copyright© M&Aクラウド class UndefinedXAccount extends XAccountInterface { public function isDefined(): false { return false; } public function isUndefined(): true { return true; } } 型表現を豊かにしてみよう その1 Nullオブジェクトパターンで使う👻 class XAccount extends XAccountInterface { public function isDefined(): true { return true; } public function isUndefined(): false { return false; } } UndefinedXAccount.php XAccount.php

Slide 13

Slide 13 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(引数)🧩 getAandB(new ClassAB()); //Call getAandB A&B ⬅ ClassAB OK

Slide 14

Slide 14 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(引数)🧩 getAandB(new ClassAB()); //Call getAandB  $tryDnfArg->getAB(new ClassAB()); //Call getAB $tryDnfArg->getAandB(new ClassABC()); //Call getAandB $tryDnfArg->getAB(new ClassABC()); //Fatal Error サンプルコード 引数の場合は、 A&B ⬅ ClassABC OK ClassAB ⬅ ClassABC Error

Slide 15

Slide 15 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(引数)🧩 A 泳げる インターフェース B えらで呼吸 インターフェース A 泳げる インターフェース A&B 泳げて 水中で呼吸できる C 魚類

Slide 16

Slide 16 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(引数)🧩 A 泳げる インターフェース B えらで呼吸 インターフェース C 肺で呼吸 インターフェース A&B 泳げて 水中で呼吸できる C 魚類 ❌

Slide 17

Slide 17 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(引数)🧩 A 泳げる B えらで呼吸 C 肺で呼吸 A&B 泳げて 水中で呼吸 より広い型を受け入れられる 反変性 ※DNF型だから反変性を持つ訳ではなく、型表現の幅 が広がるという意味です。 「共変性と反変性」の完全サポートはPHP7.4から

Slide 18

Slide 18 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(戻り値)🧩 getAandB()?->callB(); //CallB

Slide 19

Slide 19 text

Copyright© M&Aクラウド getAandB()?->callB(); //CallB $tryDnfRV->getAandB()?->callC(); //CallC 型表現を豊かにしてみよう

Slide 20

Slide 20 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(戻り値)🧩 会場までの 行き方ガイド A&B&C&D A 飛行機 インターフェース B モノレール インターフェース C バス インターフェース D 徒歩 インターフェース 羽田からの 案内が記載 ないちゃー

Slide 21

Slide 21 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(戻り値)🧩 会場までの 行き方ガイド B&C&D A 飛行機 インターフェース B モノレール インターフェース C バス インターフェース D 徒歩 インターフェース ❌ 羽田からの 案内は不要 うちなーんちゅ

Slide 22

Slide 22 text

Copyright© M&Aクラウド 型表現を豊かにしてみよう その2 DNF型で型パズルする(戻り値)🧩 会場までの 行き方ガイド ❌ 受け入れる型を絞る 共変性 ※DNF型だから共変性を持つ訳ではなく、型表現の幅 が広がるという意味です。 「共変性と反変性」の完全サポートはPHP7.4から

Slide 23

Slide 23 text

Copyright© M&Aクラウド バージョンアップしてみた 23

Slide 24

Slide 24 text

Copyright© M&Aクラウド よし!バージョンアップだ! ● PHP8.1からのアップデートだし、⼤きな差分はないのでは? ● バージョンを上げてみて、テストを動かしてみる!! ○ ?⾝に覚えのない箇所でエラーがちらほら? バージョンアップしてみた

Slide 25

Slide 25 text

Copyright© M&Aクラウド バージョンアップしてみた

Slide 26

Slide 26 text

Copyright© M&Aクラウド バージョンアップしてみた

Slide 27

Slide 27 text

Copyright© M&Aクラウド バージョンアップしてみた

Slide 28

Slide 28 text

Copyright© M&Aクラウド バージョンアップしてみた

Slide 29

Slide 29 text

Copyright© M&Aクラウド バージョンアップしてみた 原因はどこなんだ...👀

Slide 30

Slide 30 text

Copyright© M&Aクラウド バージョンアップしてみた

Slide 31

Slide 31 text

Copyright© M&Aクラウド バージョンアップしてみた つまりどうなるのか?🙄 +-3 day PHP8.2以降は 「+3 day」として処理される PHP8.2以前は 「-3 day」として処理される

Slide 32

Slide 32 text

Copyright© M&Aクラウド バージョンアップしてみた 下位互換性のない変更点は要チェック👀

Slide 33

Slide 33 text

Copyright© M&Aクラウド おまけ 33

Slide 34

Slide 34 text

Copyright© M&Aクラウド おまけ もうすぐPHP8.3リリースですね🙌 ● 予定通り⾏けば 2023/11/23 リリース予定

Slide 35

Slide 35 text

Copyright© M&Aクラウド まとめ 35

Slide 36

Slide 36 text

Copyright© M&Aクラウド まとめ ● PHP8.2から新しく実装機能がたくさん ● PHPのバージョンを上げて、型表現を豊かにしよう ○ true/false/nullが独⽴した型で使える ○ 選⾔標準形 (Disjunctive Normal Form) 型が使える ● バージョンを上げる時には「下位互換性のない変更点」をチェック ● もうすぐPHP8.3がリリースされる

Slide 37

Slide 37 text

Copyright© M&Aクラウド 参考資料 ● https://www.php.net/releases/8.2/ja.php ● https://www.prime-strategy.co.jp/column/archives/column_5253 ● https://qiita.com/rana_kualu/items/fc4b02e2daaf102aa92f ● https://www.cyberer.net/2020/03/covariant-contravariant.html ● https://www.php.net/manual/ja/language.oop5.variance.php ● https://zukan.com/fish/internal2961

Slide 38

Slide 38 text

Copyright© M&Aクラウド ありがとうございました! 38