Page 1
配列、ジェネリクス、
PHPで書けない型
公開補訂版
Arrays, Generics, and Types that cannot be type-declared.
pixiv Inc.
USAMI Kenta
2021.10.03
公開日:
by USAMI Kenta@tadsan
にオンラインのYouTube Liveで開催された『PHPカンファレンス2021』でレギュラーセッション(30分)として発表しました。
2021.10.03
お前誰よ
tadsanのあれこれが読める場所
いきなりですが問題です
function id(mixed $value): mixed {return $value;}
PhpStormとかでメソッド名補完がきく
$date = new DateTimeImmutable();$date->diff(
PhpStormとかでメソッド名補完がき…かない
$date = new DateTimeImmutable();id($date)->diff(
なんでも受け取ってなんでも返す
function id(mixed $value): mixed {return $value;}
本日の目標はこういうときに怯えず型を付けることです
個々の静的解析ツール導入方法などは今回は扱いません
ただし最新のPhpStorm 2021.2では静的解析ツールを導入しなくてもすんなり動くと思います
型とPHPの歴史
型とは何か
$a : array
$b : int
そもそも計算できない
PHPの型宣言の特徴
デフォルトではキャストよりも厳密に値を判定した上で型変換を行う
返り値でintに
パラメータ
変換する
mixed
1 : int
0 : int
返り値で厳密な
チェック
漸進的型付けで動的言語を型検査する
function add($a, $b) {return $a + $b;}
int + intって本当にintなの?
function add(int $a, int $b):int {return $a + $b;}
ひとつの解決策ではあるが… 不必要にËoatを強制するのか
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;}
かくしてPHPはPHPDocなんか書かなくても良い平和な世界になりました
上司「共著を想定できてる?」
class Book{function __construct(private Author $author) {// ...}}
arrayにすることで複数であることを表現
Authorクラスの情報が減ってる…
class Book{function __construct(private array $authors) {// ...}}
Book::$authors : array
中身が何かわからない!
Authorクラスのメソッドを補完できない
class Book{function printAuthors($fp): void {foreach ($this->authors as $author) {fwrite($fp, $author->getName());}}}
arrayにすることで複数であることを表現
Authorクラスの情報が減ってる…
class Book{function __construct(private array $authors) {// ...}}
PHPDocの復活
class Book{function __construct(/** @var array<Author> */private array $authors) {// ...}
Book::$authors :array<Author>
Authorクラスのメソッドが補完できる
class Book{function printAuthors($fp): void {foreach ($this->authors as $author) {fwrite($fp, $author->getName());}}}
list<int>
array<int,string>
array{id:int, name:string}
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<array{id:int, name:string}>
配列の記法
function id(mixed $value): mixed {return $value;}
/*** @template T* @phpstan-param T $value* @phpstan-return T*/function id(mixed $value): mixed {return $value;}
PhpStormとかでメソッド名補完がきくようになった
$date = new DateTimeImmutable();id($date)->diff(
/*** @template T* @param array<T> $XS* @param T $default* @return T*/function first(array $xs, string $default): mixed {return $value;}
function first(array $xs, mixed $default): mixed {foreach ($xs as $x) return $x;return $default;}
/*** @template T* @param array<T> $xs* @param T $default* @return T*/function first(array $xs, mixed $default): mixed {foreach ($xs as $x) return $x;return $default;
PhpStormとかでメソッド名補完がきく
// list<DateTimeImmutable> を返す関数
$dates = get_dates();$first = first($dates, new DateTimeImmutable);$first->diff(
FOT-ハミング Std (M)
BIZ UDPゴシック (Regular)
Courier (Regular)
