Page 1
配列の型と向き合う
2020-02-26 PHP勉強会@東京
#phpstudy
公開日:
by USAMI Kenta@tadsan
に東京都中央区日本橋のサイボウズ株式会社で開催された『第145回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。
2020-02-26 PHP勉強会@東京
#phpstudy
近況
⛳
文字を書いても書いても終らない
何があったのか?
本日のお題
型、ついてますか?
今回はLTなので皆様既にPhpStormのために型をつけてる前提でいきます
前提
mixedは災いのもと
mixedすると何が起こるか
間違って引数に渡しても誰も怒ってくれない
PhpStormで補完が効かなくて非常に気持ち悪い
静的解析性も開発体験も損ねる
PhpStormでの開発体験を上げるにはmixedを追放して型を付けていくしかない
肝に命じてほしい
さて
日曜の夜くらいから記事を書いていた
概要だけ書いてさくっと投稿するつもりだった
書いても書いても終らん
なので配列の話だけします
@param
array
@return
array
@var
array
書いてますか?
こいつは何を言っているのか
<?php
function getIds(): array {return ...}
foreach (getIds() as $id) {$id}
<?php
function getIds(): array {return ...}
foreach (getIds() as $id) {
}
arrayはmixed
arrayを許してはいけない
Laravelのコードを読んでもarrayまみれ
じゃあどうすればいいの
@return int[]
@return BookId[]
解決
本当に?
🙅
配列の用途は複数ある
リストのarray
$ids =
[1, 5, 9];
// @return int[]
// @return array<int>
$ids =
[1, 5, 9];
@return int[]
phpDocumentor形式
@return array<int>
コレクションジェネリクス記法
旧PSR-5形式
@return
ArrayObject<int>
コレクションジェネリクス記法
旧PSR-5形式
連想配列のarray
$id_name_table =
[
1 => "田中",
5 => "佐藤",
9 => "山田",
];
// @return array<int,string>
$id_name_table =
[
1 => "田中",
5 => "佐藤",
9 => "山田",
];
構造体のarray
$record =
[
"id" => 1,
"name" => "田中",
];
これはPSR-5形式では表現できない
// @return
array{id:int, name:string}
$record =
[
"id" => 1,
"name" => "田中",
];
// @return
array{id:int, name:string}
またはobject-like array
// @return
array{id
?
:int, name:string}
現在はPSR-5(Draft)から外されたが、既にほとんどの静的解析ツールには実装されているので使える
ほとんどの?
Psalm
Phan
PHPStan
ほとんど=PhpStorm以外
型付けられないのお前だけ
いますぐ使おう
Psalm
Phan
PHPStan
安心ください
たとえばこういうコードがあるじゃろ
付けよう型
入れようdeep-assoc
いますぐ
ダウンロード
