Skip to content

PHPStan超クイックマスター

公開日:

東京都渋谷区GMO Yours フクラスで開催された『第150回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

PHPStan超クイックマスター

PHPStan “super” quick master

pixiv Inc.

USAMI Kenta

2021.10.02

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 エンジニア
  • 最近はピクシブ百科事典(dic.pixiv.net)を開発しています
  • Emacs Lisper, PHPer
  • Emacs PHP Modeを開発しています (2017年-)
  • プログラミング言語にちょっとこだわりのある素人

Page 3

Page 4

さて

Page 5

PHPerKaigiのチケットを買うとパンフレットがもらえる

Page 6

Page 7

PHPStan=Static Analyzer

Page 8

実行しなくてもバグの可能性を検知できる

Page 9

全8ページでPHPStanの基礎を押えられる

Page 10

実務で最低限使うために知っておきたいことを詰め込んだ… はず

Page 11

PHP本来の型のコンセプトからPHPDocによる拡張までを網羅

Page 12

僕と契約してPHPStanを完全にマスターしてよ

Page 13

という話をしたいのではない

Page 14

PHPStanは完全無料なのでいますぐ入れよう

Page 15

これからプロになりたい人に本当に伝えたいPHPDocの書きかた

Page 16

その1配列は使い分ける

Page 17

世の中にはいろんな配列がある

Page 18

[1, 2, 3]

Page 19

['name' => 'Miku','age' => 14,]

Page 20

['Miku', 'Rin', 'Luka',]

Page 21

['main' => 'Miku','sub' => 'Rin','chorus' => 'Luka',]

Page 22

単なる型で書くと

array

Page 23

interface X{function a(): array;}

Page 24

function (X $obj) {$a = $obj->a();};

Page 25

function (X $x) {$a = $x->a();$v = $a[0];};

Page 26

配列から取り出した要素の型がわからないのは都合が悪い

Page 27

array<int>array<string>

Page 28

ちょっと前はint[] とか string[]とか書かれてた

Page 29

PSR-5式の配列記法(ジェネリクス)

array<int,User>

array<string, User>

  • 配列インデックスの型を指定できる
  • 以下の配列が区別できる
  • [12 => new User(), 34 => new User()]
  • ['太郎' => new User(), '花子' => new User()]
  • [new User('太郎'), new User('花子')]

list<User>

Page 30

配列には2通りある

Page 31

同じような構造が繰り返す配列

Page 32

キーによって別の意味の値が入っている配列

Page 33

$a = ['name' => '初音ミク','age' => 16,];

// array{name:string, age: int}

Page 34

array{name: string,age: int}

Page 35

$a = ['初音ミク', 16];// array{0: string, 1: int}

Page 36

繰り返すなら<>キーごとに違うなら{}

Page 37

その2型は入出力に宿る

Page 38

クエリパラメータから値をとりたい

Page 39

function getById(int $id): Article{//}

Page 40

クエリパラメータからID値をとりたい

Page 41

実際あぶない

$id = $_GET['id'];

$article = getById($id);

Page 42

// ?id=1$_GET['id'] === '1';

Page 43

// ?id=a$_GET['id'] === 'a';

Page 44

// ?id[]=a$_GET['id'] === ['a'];

Page 45

危険ではないがよくはない

$id = (int)$_GET['id'];

Page 46

安全に

int|false

$id = filter_var($_GET['id'] ?? '',FILTER_VALIDATE_INT);

Page 47

その3むやみに@var書かない

Page 48

初心者殺しなことに@varには複数の用法

Page 49

@varはプロパティに付けて書くもの

Page 50

class Book{/** @var string */public $name;}

Page 51

class Book{

public string $name;}

Page 52

class Book{/** @var list<Author> */public $authors;}

Page 53

class Book{

public list<Author> $authors;}

Page 54

class Book{/** @var list<Author> */public array $authors;}

Page 55

@varはconstには基本的に付けない

Page 56

class Book{/** @var list<int> */const IDS = [1, 2, 3];}

Page 57

できればつけない方がいい

class Book{/** @var list<int> */const IDS = [1, 2, 3];}

Page 58

@varをつけない場合

Book::IDS[0] // => 1

Book::IDS[1] // => 2

Book::IDS[2] // => 3

Page 59

@varを付けると弱くなる

Book::IDS[0] // => int

Book::IDS[1] // => int

Book::IDS[2] // => int

Page 60

ローカル変数に@varを書く

Page 61

できれば書かないでくれ!!

Page 62

むやみに@varを書かないテク

Page 63

そのうちどこかにちゃんと書きます…