6
4

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.

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

Last updated at Posted at 2019-02-25

コレクション :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:

6
4
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
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?