個人的な感想ですが、PHP で大きめな規模の開発をする上で、関数の宣言で型の指定を要求できるのは非常に便利だと感じています。
とくに開発に関与するプロジェクトのメンバーが増えたときや、開発期間が伸びて規模が大きくなるにつれて威力が発揮すると思っていて、誰よりも自分が恩恵に預かっています。(自分が自分のI/Fを誰よりも忘れがちだから)
そんな型宣言ですが、使っていて地味に行き届かない感を抱いていたのが配列とかを使う場合でした。
イメージとしては、こんな関数で int[]
という要求をしたい場合とか
function sum(array $num): int {
return array_sum($num);
}
仕方が無いから、必要に応じてバリデーションを書いたりしていたのですが、PHP ドキュメントを読んでいたら
... トークンの前に、 タイプヒント を付加することもできます。
という、そのものずばりな解決方法がありました。
function sum(int ...$num): int {
return array_sum($num);
}
これは便利!
可変長引数リストは引数の設計に依存するので、I/Fが判り難くなってしまったり使い勝手が悪くなる場合とかもあるとは思いますが、可変長引数リストを使ってラップしたり工夫次第で活用できる場面は多いように思います。
class Collection
{
public function __construct(array $items)
{
$this->registerItem(...$items);
}
private function registerItem(ItemInterface ...$items): void
{
$this->items = $items;
}
}
書き忘れていたので追記ですが、可変長引数リストが使いやすい理由のもう一つが、「配列変数や Traversable クラスを引数リストに含めることができる」ので、例えば Laravel とかで開発しているときにコレクションをそのまま使えることなんかが非常に便利です。(これに気づいてなかったときは、いちいち all()
メソッドで配列にしてから渡してた)
$a = collect([1, 2, 3]);
$f = function (int ...$args) {
return array_sum($args) * 2;
};
$f(...$a); // => 12