はじめ
Laravelを使っている皆様はもうすでにご存知かと思いますが、7月19日〜20日にLaraconが行われました。そこでテーラーさんがLaravel 11の機能をデモしたり、いろいろな大事な発表が行われた上、宴会(飲み会)も行われ、エンジニア同士で気軽にワイワイしながらコミュニケーションを取ることもできました。その際、数人のエンジニアとの会話から、アイデアが生まれ、宴会でペアプロを行ったようです。今回紹介するensureの関数はそのペアプロの結果です。
ensureが生まれた理由
コレクションは開発者にとって欠かせないものかと思いますが、残念ながらコレクションの中身の型付けを設定することができません。そのため、下記のように一つのコレクションでも複数の種類の型のものが混ざってしまう可能性もあり、ランタイムに例外が発生するケースがあります。
$collect = collect([1, 2, 3, 'happy']);
$newCollect = $collect->map(
fn ($item) => $item * 10 // 'happy' * 10 でTypeErrorが発生する
);
ensure()
の関数はそのようなランタイムのエラーが起こる前に、コレクションの中身の型がすべて同じかどうかのチェックを行う役割を果たします。
ensureの使い方
確認したいコレクションに対してensure()
関数を呼び出し、確定したい型のstringを引数として渡すことです。
$collect = collect([1, 2, 3, 4]);
$collect->ensure('int');
string・int・bool
といった基本の型の他にも、Modelなどのどんなクラスの型も確認できます!
$collect->ensure(App\User::class);
定義していない型のアイテムがある場合、UnexpectedValueException
のエラーが発火されるようになっています。ensureの判定ではPHPのget_debug_type()を使っているため、厳密な比較となり、PHPではよくあるstring -> int
やbool -> int
などの変換を考慮する必要がありません。
$collect = collect([1, 2, 3, 'happy']);
$collect->ensure('int'); // happyでUnexpectedValueExceptionで発生する
// 厳密比較の例
$collect = collect([true, false, 0, null, 'true', 'false']);
$collect->ensure('bool'); // 0でUnexpectedValueExceptionで発生する
まとめ
Laravelの10.15に追加されたensure()
の関数で、コレクションに対して処理する前に、中身のすべてが期待している型かどうかをチェックできるようになりました。
この機能は便利ですが、私がこの機能を紹介する理由としては、この機能が生まれた背景です。数年間の間、コロナの影響でこのような宴会・LT大会などのエンジニア同士の集まる機会は減少しました。そのため、エンジニア同士の交流や会話が減少しました。こうしたイベントが少しずつ増え、これからのエンジニア同士の交流から生まれることをとても楽しみにしています!