Page 1
PHP8時代に
array型と向き合う
Faced with array type in the PHP 8.x era
pixiv Inc.
USAMI Kenta
2021-12-21 PHPerKaigi petit - PHP8.1リリース祝賀会
公開日:
by USAMI Kenta@tadsan
にオンラインのYouTube Liveで開催された『PHPerKaigi petit - PHP8.1リリース祝賀会』で発表枠(20分)として発表しました。
2021-12-21 PHPerKaigi petit - PHP8.1リリース祝賀会
お前誰よ
tadsanのあれこれが読める場所
なんかいろいろ話してきました
PHPの進化は型宣言の進化
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;}
クラスの型もPHP7→8で進化
class Book{/** @var Author */private $author public function __construct(Author $author) {$this->author = $author;}}
class Book{/** @var Author */private Author $author public function __construct(Author $author) {$this->author = $author;}}
class Book{function __construct(private Author $author) {// 何も書かなくてもプロパティに代入される
}}
class Book{function __construct(public readonly Author $author) {// 何も書かなくてもプロパティに代入される
}}
かくしてPHP PHPDocの型が不要な世界に
上司「共著を想定できてる?」
class Book{function __construct(private Author $author) {// 何も書かなくてもプロパティに代入される
}}
arrayにすることで複数であることを表現
class Book{function __construct(private array $authors) {// 何も書かなくてもプロパティに代入される
Authorクラスの情報が減ってる…
}}
Book::$authors : array
中身が何かわからない!
Authorクラスのメソッドを補完できない
class Book{function printAuthors($fp): void {foreach ($this->authors as $author) {fwrite($fp, $author->getName());}}}
何か大事なものを失ってしまった気がする
今回は配列に絞って話します
PHPの配列はハッシュテーブル
(ポインタとかアドレスとかの概念が絡んでくる)
PHPの配列はハッシュテーブル
ハッシュテーブルに詰め替えられる
連想配列 vs リスト
連想配列と連続した値を厳密に比較したいことはありうる
array_is_list()について
array<int,string> の代りに list<string>と書ける
Authorsはどうなればよかったのか
class Book{function __construct(
private array $authors) {// 何も書かなくてもプロパティに代入される
}}
class Book{function __construct(/** @var list<Authors> */private array $authors) {// 何も書かなくてもプロパティに代入される
}}
list<int>
array<int,string>
array{id:int, name:string}
[['id' => 123, 'name' => '野比のび太'],['id' => 234, 'name' => '源静香'],]
list<array{id:int, name:string}>
