LoginSignup
0
0

More than 5 years have passed since last update.

phpの参照渡しの注意点

Posted at

参照渡し自体が非推奨という話は一旦置いておきますが、参照渡しがちゃんと理解できていなくてちょっとハマりました。

$meats = array('beef', 'pork', 'mutton');

foreach($meats as &$meat){
    $meat = 'so big ' . $meat;
}

foreach($meats as $meat){
    echo($meat);
}

// 'so big beef'
// 'so big pork'
// 'so big pork'

配列の最終要素の参照がうまくいきまてん。

原因

はじめのループを抜けた時点で\$meat変数のポインタは外れていないため、\$meatは\$meats[2]を指したままでした。
そのため、2回目のループでは、以下のようなことが起こっています。

・\$meats[2]に\$meats[0]を代入 → // \$meats[0] = 'so big beef', \$meats[2] = 'so big beef'
・\$meats[2]に\$meats[1]を代入 → // \$meats[1] = 'so big pork', \$meats[2] = 'so big pork'
・\$meats[2]に\$meats[2]を代入 → // \$meats[2] = 'so big pork', \$meats[2] = 'so big pork'

ややこし…。

解決策

・はじめのループの後で$meat変数の参照を解除(unset)する
・もしくは、2回目のループでは別の変数を使う

$meats = array('beef', 'pork', 'mutton');

foreach($meats as &$meat){
    $meat = 'so big ' . $meat;
}

unset($meat);

foreach($meats as $meat){
    echo($meat);
}

// 'so big beef'
// 'so big pork'
// 'so big mutton'
0
0
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
0
0