Page 1
ジェネリクスを
自分のものにする
Getting Started with Generic Programming
pixiv Inc.
USAMI Kenta
2022-01-25 Qiita Night ~PHP~
公開日:
by USAMI Kenta@tadsan
にオンラインのZoomウェビナーで開催された『Qiita Night~PHP~』でライトニングトーク(10分)として発表しました。
2022-01-25 Qiita Night ~PHP~
お前誰よ
ジェネリクスの話をしよう
データ型に依存しない…?
抽象的かつ汎用的…?
まず基本的な静的型の話
型付けの具体例を見ていきましょう
まずはジェネリクスとあまり関係ない例
型宣言なし
= mixed
function add($a, $b) {return $a + $b;}
int + intって本当にintなの?
function add(int $a, int $b): int {return $a + $b;}
ひとつの解決策ではあるが… 不必要にfloatを強制するのか
function add(float $a, float $b): float {return $a + $b;}
あえて型宣言を省略する
/*** @param int|float $a* @param int|float $b* @return int|float*/function add($a, $b) {return $a + $b;}
function add(int|float $a, int|float $b): int|float {return $a + $b;}
かくして世界は型の炎に包まれた
だが型なしは死滅していなかった
別の例を考えてみましょう
function first(array $a, mixed $default): mixed {return $a[0] ?? $default;}
$vの型は何?
$v = first([0, 1, 2], 'default');
function first_int(array $a): ?int {return $a[0] ?? null;}
$v = first_int([0, 1, 2]) ?? 'default';
function first_string(array $a): ?string return $a[0] ?? null;}
$v = first_string(['a', 'b', 'c']) ?? 'default';
function first_DateTime(array $a): ?DateTime return $a[0] ?? null;}
$v = first_DataTime([]) ?? 'default';
関数量産はめんどくさい
なんでDateTimeとか
function first(array $a): int|string|DateTime|null {return $a[0] ?? $default;}
出てくるの?
$v = first([0, 1, 2], 'default');
?DateTimeとかint|falseくらいなら問題ない
それを補うのがPHPDoc
PHPDocタグいくついえるかな
/*** @template TValue* @template TDefault* @param array<TValue> $a* @param TDefault $default* @return TValue|TDefault*/function first(array $a, mixed $default) {
いまは内部型表現の制約でシンプルな型しか付かないが
そのうち万病に効くようになる
テンプレートはクラスにも書ける
ジェネレータでも使える
コレクションも簡単に定義できる
実際難しいことは(そんなに)やってない
試行錯誤したことがない技術が難しいのはあたりまえ
PHPStanはWebでこねこね試行錯誤がやりやすい
PHPStan完全にマスターしよう
今回はひたすら実例を詰め込んで話しました
ジェネリクスの知識はなくてもPHPStanは使える
会社で実用しようPHPStan
