Help us understand the problem. What is going on with this article?

【 Laravel 】配列の参照渡しをするならば、代わりにコレクションを使う方が良さそう

More than 1 year has passed since last update.

コレクション :book:

コレクションは、配列データを操作するためのクラスです。

配列で参照渡しを行う必要が出てきた場面で、Laravelの場合にはコレクションを使った方が良さそうです。参照渡しは便利ですが以下のようなデメリットがあります:thinking:

参照渡しのデメリット :point_up:

  • 参照渡しの & に気づきにくい。
  • 影響範囲が分かりにくくなる。

そのためにミスや間違いが多くなってしまいます。

配列の参照渡しを使う例

配列に参照渡しで値を追加するコード:robot:

public function getIndex()
{
    $array = [];

    // 参照渡しで3回実行
    $this->appendValue($array);
    $this->appendValue($array);
    $this->appendValue($array);

    // 配列の確認
    var_dump($array);
}


// 引数に配列の参照渡し
public function appendValue(array &$array)
{
    $array[] = 'value';
}


--------------------------------------------------------

出力結果↓↓↓

// var_dump($array);
array (size=3)
  0 => string 'value' (length=5)
  1 => string 'value' (length=5)
  2 => string 'value' (length=5)

& に気づきにくく、配列を初期化しているにも関わらず代入をしていないので影響に気づきにくいです。:taco:

配列に対して、returnをせずに中身の変更や追加をしたい場合には参照渡しよりもコレクションを作ってしまった方が影響範囲を狭くできます。:point_up:

代わりに、コレクションを使う例

例としては以下の通りです。

public function getIndex()
{
    // collect()ヘルパでインスタンスを作成
    $collection = collect();

    // コレクションへの追加を3回実行
    $this->appendValue2($collection);
    $this->appendValue2($collection);
    $this->appendValue2($collection);

    // コレクションの確認
    var_dump($collection);

    // コレクションを配列形式で確認
    var_dump($collection->all());
}

// 引数にコレクションを指定
public function appendValue2(\Illuminate\Support\Collection $collection)
{
    $collection->push('value');
}

--------------------------------------------------------

出力結果↓↓↓

// var_dump($collection);
object(Illuminate\Support\Collection)[422]
  protected 'items' => 
    array (size=3)
      0 => string 'value' (length=5)
      1 => string 'value' (length=5)
      2 => string 'value' (length=5)


// var_dump($collection->all());
array (size=3)
  0 => string 'value' (length=5)
  1 => string 'value' (length=5)
  2 => string 'value' (length=5)

以上のように配列の参照渡しと同様のことをコレクション化しても実現できます。:raising_hand:

まとめ

参照渡しの配列を使う場合...
同じ操作をコレクションでも実現できるので、どうしても配列型でなければならないケース以外はコレクションで渡した方が良いです :grinning:

creema
全国のつくり手とつかい手が Web 上で直接作品を売買できる、日本最大級のハンドメイドマーケットプレイス「Creema」の企画、開発、運営するスタートアップです。「本当にいいものが埋もれてしまうことのない、フェアで大規模な新しい経済圏をつくろう」を合言葉に、メンバー一丸となって、たのしくストイックに活動を行っています。
https://www.creema.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away