Page 1
配列に型を付ける(実践篇)
Practice to type array
pixiv Inc.
USAMI Kenta
2022-01-22 PHPerKaigi petit@福岡
公開日:
by USAMI Kenta@tadsan
にオンラインのYouTube Liveで開催された『PHPerKaigi petit @福岡 202201』で発表枠(20分)として発表しました。
2022-01-22 PHPerKaigi petit@福岡
お前誰よ
tadsanのあれこれが読める場所
要約:型宣言arrayだけでは不十分なので、もっと詳しく書かねばならぬ
Book::$authors : array
中身が何かわからない!
Authorクラスのメソッドを補完できない
class Book{function printAuthors($fp): void {foreach ($this->authors as $author) {fwrite($fp, $author->getName());}}}
ならぬと言われてもどう書けばいいのかわからん
2021.10.02
配列は単一の型ではないことを認める
PHPマニュアルより引用
今回の主題はこれではないので一旦忘れてください
重要なのはデータの持ちかた
list<int>
array<int,string>
array{id:int, name:string}
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<array{id:int, name:string}>
arrayのふるさと
arrayリテラル
hoge('key' => 'value')はsyntax errorになる
[0 => '1', 1 => '初音ミク', 'id' => '1', 'name' => '初音ミク']
['id' => '1', 'name' => '初音ミク'],['id' => '2', 'name' => '鏡音リン'],['id' => '3', 'name' => '鏡音レン'],]
なぜ配列に型がつかないのか
型宣言にarrayとしか書かないと
/** DBからユーザーを取得する */
function findUsers(array $ids): array {}
// こういうパラメータを渡されても困る
$users = findUsers(['hoge' => 'fuga'])// $idsというパラメータから推測しろ? うーんわからん
/** 検索する */
function search(string $word, array $opt): array {}
$result = search('検索したい単語');
// 実装を確認しに行かないとわからない
$result = search('検索したい単語', [?????]);
/*** @param User[] $users*/function printUsers(array $users): void {foreach ($users as $user) {echo $user->name, "\n";}}
array<int,User>
array<string,User>
list<User>
/*** @param User[] $users*/function printUsers(array $users): void {foreach ($users as $user) {echo $user->name, "\n";}}
/*** @param array<User> $users*/function printUsers(array $users): void {foreach ($users as $user) {echo $user->name, "\n";}}
変数リテラルや定数は @var を避ける
