また一つつまづいたところを書きます。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'; } ?>
これでめでたくハゲになりました。