7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP の可変長引数リストと型宣言を組み合わせると配列のタイプヒントができて便利

Last updated at Posted at 2018-06-05

個人的な感想ですが、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
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?