Page 1
PHP8時代にarray型と向き合う
Faced with array type in the PHP 8.x era
pixiv Inc.
USAMI Kenta
Tue Dec 21 2021 09:00:00 GMT+0900 (Japan Standard Time)
PHPerKaigi petit - PHP8.1リリース祝賀会
公開日:
by USAMI Kenta @tadsan
にオンラインのYouTube Liveで開催された『PHPerKaigi petit - PHP8.1リリース祝賀会』で発表枠(20分)として発表しました。
PHP8時代にarray型と向き合う
Faced with array type in the PHP 8.x era
pixiv Inc.
USAMI Kenta
Tue Dec 21 2021 09:00:00 GMT+0900 (Japan Standard Time)
PHPerKaigi petit - PHP8.1リリース祝賀会
お前誰よ
tadsanのあれこれが読める場所
WEB+DB PRESS総集編
Software Design 11月号
前回までのあらすじ
最後のPHP勉強会
(2020年)
PHPカンファレンス沖縄2021
PHPカンファレンス2021
なんかいろいろ 話してきました
PHPの進化は 型宣言の進化
型がついていない関数(PHP5)
function add($a, $b) {
return $a + $b;
}
スカラー型宣言(PHP7)
int + intって
本当にintなの?
function add(int $a, int $b): int {
return $a + $b;
}
広い値をとるにはfloatが必要
ひとつの解決策では
あるが… 不必要にfloat
を強制するのか
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;
}
クラスの型も
PHP7→8で進化
著者を持つBookクラス
class Book
{
/** @var Author */
private $author
public function __construct(Author $author) {
$this->author = $author;
}
}
PHP 7.4でプロパティ型宣言
class Book
{
/** @var Author */
private Author $author
public function __construct(Author $author) {
$this->author = $author;
}
}
コンストラクタプロモーション
(PHP8)
class Book
{
function __construct(
private Author $author
) {
何も書かなくてもプロパティに代入される
//
}
}
readonlyプロパティ
(PHP8.1)
class Book
{
function __construct(
public readonly Author $author
) {
何も書かなくてもプロパティに代入される
//
}
}
かくしてPHP
PHPDocの型が
不要な世界に
Bookクラスは著者を持つ
上司
class Book
「共著を想定できてる?」
{
function __construct(
private Author $author
) {
何も書かなくてもプロパティに代入される
//
}
}
Bookクラスは複数の著者を持つ
arrayにすることで
class Book
複数であることを表現
{
function __construct(
private array $authors
) {
何も書かなくてもプロパティに代入される
//
Authorクラスの
}
情報が減ってる…
}
著者一覧を出力したい
Book::$authors : array 中身が何かわからない!
class Book
{
function printAuthors($fp): void {
foreach ($this->authors as $author) {
fwrite($fp, $author->getName());
}
Authorクラスの
}
メソッドを補完できない
}
何か大事なものを
失ってしまった
気がする
今回は配列に絞って
話します
PHPの配列は万能
PHPの配列はなんでもできる
PHPマニュアルより引用
PHPの配列は
ハッシュテーブル
JavaScript/Rubyの場合
PHPの場合
何が違うのか
他の言語における配列(array)
PHPの配列はハッシュテーブル
PHP7の内部実装から学ぶ性能改善テクニック
PHP7から内部的に「配列」が入った
連想配列 vs リスト
array_is_list()について
Authorsはどうなれば
よかったのか
Bookクラスは複数の著者を持つ
class Book
{
function __construct(
private array $authors
) {
何も書かなくてもプロパティに代入される
//
}
}
PHPDocの帰還
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}>