六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

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';
}
?>

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