Skip to content

配列の型と向き合う

公開日:

東京都中央区日本橋サイボウズ株式会社で開催された『第145回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

配列の型と向き合う

2020-02-26 PHP勉強会@東京

#phpstudy

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id: zonuexe
  • ピクシブ株式会社 pixiv運営本部
  • Emacs Lisper, PHPer, Rubyist
  • Emacs PHP Modeのメンテナ引き継ぎました
  • 好きなリスプはEmacs Lispです
  • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

Page 4

Page 5

Page 6

近況

Page 7

Page 8

文字を書いても書いても終らない

Page 9

何があったのか?

Page 10

本日のお題

Page 11

Page 12

型、ついてますか?

Page 13

Page 14

Page 15

Page 16

今回はLTなので皆様既にPhpStormのために型をつけてる前提でいきます

Page 17

前提

Page 18

mixedは災いのもと

Page 19

mixedすると何が起こるか

間違って引数に渡しても誰も怒ってくれない

PhpStormで補完が効かなくて非常に気持ち悪い

静的解析性も開発体験も損ねる

Page 20

PhpStormでの開発体験を上げるにはmixedを追放して型を付けていくしかない

Page 21

肝に命じてほしい

Page 22

さて

Page 23

日曜の夜くらいから記事を書いていた

Page 24

Page 25

概要だけ書いてさくっと投稿するつもりだった

Page 26

書いても書いても終らん

Page 27

なので配列の話だけします

Page 28

@param

array

Page 29

@return

array

Page 30

@var

array

Page 31

書いてますか?

Page 32

Page 33

こいつは何を言っているのか

Page 34

return array

<?php

function getIds(): array {return ...}

foreach (getIds() as $id) {$id}

Page 35

return array

<?php

function getIds(): array {return ...}

foreach (getIds() as $id) {

$id // ← こいつの型がわからん

}

Page 36

arrayはmixed

Page 37

arrayを許してはいけない

Page 38

Laravelのコードを読んでもarrayまみれ

Page 39

じゃあどうすればいいの

Page 40

@return int[]

Page 41

@return BookId[]

Page 42

解決

Page 43

本当に?

Page 44

🙅

Page 45

配列の用途は複数ある

Page 46

リストのarray

Page 47

$ids =

[1, 5, 9];

Page 48

// @return int[]

// @return array<int>

$ids =

[1, 5, 9];

Page 49

@return int[]

phpDocumentor形式

Page 50

@return array<int>

コレクションジェネリクス記法

旧PSR-5形式

Page 51

@return

ArrayObject<int>

コレクションジェネリクス記法

旧PSR-5形式

Page 52

連想配列のarray

Page 53

$id_name_table =

[

1 => "田中",

5 => "佐藤",

9 => "山田",

];

Page 54

// @return array<int,string>

$id_name_table =

[

1 => "田中",

5 => "佐藤",

9 => "山田",

];

Page 55

構造体のarray

Page 56

$record =

[

"id" => 1,

"name" => "田中",

];

Page 57

これはPSR-5形式では表現できない

Page 58

// @return

array{id:int, name:string}

$record =

[

"id" => 1,

"name" => "田中",

];

Page 59

// @return

array{id:int, name:string}

array-shapes記法

またはobject-like array

Page 60

// @return

array{id

?

:int, name:string}

名前と:の間に ? を

付けると

省略可能キー

Page 61

Page 62

現在はPSR-5(Draft)から外されたが、既にほとんどの静的解析ツールには実装されているので使える

Page 63

ほとんどの?

Page 64

Psalm

Phan

PHPStan

Page 65

ほとんど=PhpStorm以外

Page 66

型付けられないのお前だけ

Page 67

いますぐ使おう

Page 68

Psalm

Phan

PHPStan

Page 69

安心ください

Page 70

Page 71

たとえばこういうコードがあるじゃろ

Page 72

Page 73

Page 74

Page 75

付けよう型

Page 76

入れようdeep-assoc

Page 77

いますぐ

Page 78

ダウンロード