Page 1
PHPStan超クイックマスター
PHPStan “super” quick master
pixiv Inc.
USAMI Kenta
2021.10.02
公開日:
by USAMI Kenta @tadsan
に東京都渋谷区のGMO Yours フクラスで開催された『第150回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。
PHPStan超クイックマスター
PHPStan “super” quick master
pixiv Inc.
USAMI Kenta
2021.10.02
お前誰よ
さて
PHPerKaigiの
チケットを買うと
パンフレットがもらえる
PHPStan
=
Static Analyzer
実行しなくても バグの可能性を
検知できる
全8ページで PHPStanの
基礎を押えられる
実務で最低限使うため に知っておきたいこと を詰め込んだ… はず
PHP本来の型のコン セプトからPHPDoc による拡張までを網羅
僕と契約して
PHPStanを完全に
マスターしてよ
という話をしたい
のではない
PHPStanは
完全無料なので
いますぐ入れよう
これからプロになりた い人に本当に伝えたい PHPDocの書きかた
その1
配列は使い分ける
世の中には
いろんな配列がある
[1, 2, 3]
[
'name' => 'Miku',
'age' => 14,
]
[
'Miku', 'Rin', 'Luka',
]
[
'main' => 'Miku', 'sub' => 'Rin',
'chorus' => 'Luka',
]
単なる型で書くと
array
interface X
{
function a(): array;
}
function (X $obj) { $a = $obj->a();
};
function (X $x) { $a = $x->a();
$v = $a[0];
};
配列から取り出した
要素の型がわからない
のは都合が悪い
array<int>
array<string>
ちょっと前は
とか
int[] string[]
とか書かれてた
PSR-5式の配列記法(ジェネリクス)
array<int,User>
array<string, User>
list<User>
配列には2通りある
同じような構造が
繰り返す配列
キーによって
別の意味の値が 入っている配列
$a = [
'name' => '初音ミク',
'age' => 16,
];
// array{name:string, age: int}
array{
name: string,
age: int
}
$a = ['初音ミク', 16];
// array{0: string, 1: int}
繰り返すなら<>
キーごとに違うなら{}
その2
型は入出力に宿る
クエリパラメータから
値をとりたい
function getById(int $id): Article
{
//
}
クエリパラメータから
ID値をとりたい
実際あぶない
$id = $_GET['id'];
$article=getById($id);
// ?id=1
$_GET['id'] === '1';
// ?id=a
$_GET['id'] === 'a';
// ?id[]=a
$_GET['id'] === ['a'];
危険ではないが
よくはない
$id = (int)$_GET['id'];
安全に
int|false
$id = mlter_var(
$_GET['id'] ?? '',
FILTER_VALIDATE_INT
);
その3
むやみに@var書かない
初心者殺しなことに @varには複数の用法
@varはプロパティに
付けて書くもの
class Book
{
/** @var string */
public $name;
}
class Book
{
public string $name;
}
class Book
{
/** @var list<Author> */
public $authors;
}
class Book
{
public list<Author> $authors;
}
class Book
{
/** @var list<Author> */ public array $authors;
}
@varはconstには 基本的に付けない
class Book
{
/** @var list<int> */ const IDS = [1, 2, 3];
}
できれば
つけない方がいい
class Book
{
/** @var list<int> */ const IDS = [1, 2, 3];
}
@varを
つけない場合
Book::IDS[0] // => 1 Book::IDS[1] // => 2 Book::IDS[2] // => 3
@varを付けると
弱くなる
Book::IDS[0] // => int Book::IDS[1] // => int Book::IDS[2] // => int
ローカル変数に
@varを書く
できれば
書かないでくれ!!
むやみに
@varを書かないテク
そのうちどこかに
ちゃんと書きます…
関連リンクがありません。