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分)として発表しました。
配列に型を付ける(実践篇)
Practice to type array
pixiv Inc.
USAMI Kenta
2022-01-22
福岡
PHPerKaigi petit@
お前誰よ
Zonu.EXE
tadsanのあれこれが読める場所
WEB+DB PRESS総集編
Software Design 11月号
ツナパハに行きたかった2022
前回までのあらすじ
最後のPHP勉強会
(2020年)
PHPカンファレンス沖縄2021
PHPカンファレンス2021
PHPerKaigi petit 8.1
(2021年)
要約:
型宣言arrayだけでは 不十分なので、もっと 詳しく書かねばならぬ
著者一覧を出力したい
Book::$authors : array 中身が何かわからない!
class Book
{
function printAuthors($fp): void {
foreach ($this->authors as $author) {
fwrite($fp, $author->getName());
}
クラスの
Author
}
メソッドを補完できない
}
りくつはわかった
ならぬと言われても どう書けばいいのか
わからん
配列に型を付ける(実践篇)
Practice to type array
pixiv Inc.
USAMI Kenta
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リテラル
デシリアライズ・eval
PDOの場合
PDOの場合 (fetchAll)
HTTPリクエスト
($_GET, $_POST)
なぜ配列に
型がつかないのか
デシリアライズ・eval
(再掲)
実際のデシリアライズ・eval
型宣言に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";
}
}
従来記法の欠点
PSR-5式の配列記法(ジェネリクス)
array<int,User>
array<string,User>
list<User>
従来多用されていた記法
/**
* @param User[] $users
*/
function printUsers(array $users): void {
foreach ($users as $user) { echo $user->name, "\n";
}
}
旧PSR-5式の記法
/**
* @param array<User> $users
*/
function printUsers(array $users): void {
foreach ($users as $user) { echo $user->name, "\n";
}
}
変数リテラルや定数は @var を避ける