PHPの配列の参照渡し

また一つつまづいたところを書きます。PHPの配列を関数に渡すと、デフォルトでは参照渡しではなく、なんと値渡しになってしまう。

<?php
$array = array('i', 'have', 'black', 'hair');
SetHage($array);
print_r($array); //Array ( [0] => i [1] => have [2] => black [3] => hair )
function SetHage($array)
{
$array[2] = 'no';
}
?>

ハゲにならない。SetHage関数には、$arrayの内容がまるまるコピーされて、$array[2]を変更しても元の関数に何の影響も与えてない。PHPで配列とはリテラルそのもの、ということなのか?これもC言語使いやJavaScriptからしても不思議な挙動で、ふつう配列はポインタが関数に渡されるものだ、という感覚でコードを書いてしまう。マニュアルによれば、配列の内容を書き換えたかったら明示的に参照渡しを使え、ということだそうだ。でかい配列をたくさん作ったのなら、それを使う関数は参照渡しにしておかないとオーバーヘッドかかってしょうがないことになりそうだ。

<?php
$array = array('i', 'have', 'black', 'hair');
SetHage($array);
print_r($array); //Array ( [0] => i [1] => have [2] => no [3] => hair )
function SetHage(&$array)
{
$array[2] = 'no';
}
?>

これでめでたくハゲになりました。


コメントを残す

メールアドレスが公開されることはありません。