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分)として発表しました。
ジェネリクスを
自分のものにする
Getting Started with Generic Programming
pixiv Inc.
USAMI Kenta
2022-01-25
Qiita Night ~PHP~
お前誰よ
静的解析してますか?
ジェネリクスの
話をしよう
ジェネリックプログラミング - Wikipedia(2022-05-02T17:30:09の版)より引用
データ型に
依存しない…?
抽象的かつ 汎用的…?
まず基本的な
静的型の話
静的型付け
(statically typing)
型付けの具体例を 見ていきましょう
まずはジェネリクスと
あまり関係ない例
型がついていない関数(PHP5)
型宣言なし = mixed
function add($a, $b) {
return $a + $b;
}
スカラー型宣言(PHP7)
int + intって
本当にintなの?
function add(int $a, int $b): int {
return $a + $b;
}
広い値をとるにはfloatが必要
ひとつの解決策では
あるが… 不必要に(cid:190)oat
を強制するのか
function add(float $a, float $b): float {
return $a + $b;
}
PHPDocの型注釈
(アノテーション)
/**
* @param int|float $a
あえて型宣言を省略する
* @param int|float $b
* @return int|float
*/
function add($a, $b) {
return $a + $b;
}
ユニオン型宣言 (PHP8.0)
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');
int専用関数をつくろう
function first_int(array $a): ?int {
return $a[0] ?? null;
}
$v = first_int([0, 1, 2]) ?? 'default';
string専用関数をつくろう
function first_string(array $a): ?string
return $a[0] ?? null;
}
$v = first_string(['a', 'b', 'c']) ?? 'default';
DateTime専用関数をつくろう
function first_DateTime(array $a): ?DateTime
return $a[0] ?? null;
}
$v = first_DataTime([]) ?? 'default';
関数量産は
めんどくさい
ユニオン型は問題解決しない
function first(array $a): int|string|DateTime|null {
return $a[0] ?? $default;
なんでDateTimeとか
}
出てくるの?
$v = first([0, 1, 2], 'default');
?DateTimeとか
int|falseくらいなら
問題ない
それを補うのが
PHPDoc
PHPDocタグ
いくついえるかな
@param
@return
@var
@template
…なにそれ?
@template は型変数
/**
* @template TValue
* @template TDefault
* @param array<TValue> $a * @param TDefault $default * @return TValue|TDefault
*/
function first(array $a, mixed $default) {
やっていきましょう
いまは内部型表現の
制約でシンプルな 型しか付かないが
そのうち
万病に効くようになる
テンプレートは
クラスにも書ける
ジェネレータでも
使える
コレクションも
簡単に定義できる
tagged union
モナド
実際難しいことは
(そんなに)
やってない
試行錯誤したことが
ない技術が難しいのは
あたりまえ
PHPStanは
Webでこねこね
試行錯誤がやりやすい
PHPStan
完全にマスターしよう
今回はひたすら
実例を詰め込んで
話しました
ジェネリクスの知識は
なくても
PHPStanは使える
宣伝
会社で実用しよう
PHPStan
