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 = mlter_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

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