ここでは、PHP の関数の引数が値渡しと参照渡しの時それぞれどのように動作するかの確認結果を掲載しています。また、本ページの最後で、PHP マスターであるあなたの意見も募集中です。
スポンサーリンク
値渡しと参照渡しの場合の動作結果
次のサンプルコードによってパラメータが値渡しの時と参照渡しの場合においてそれぞれ、関数から復帰した時のパラメータの内容を確認しています。詳細はサンプル内のコメントも参照ください。
// パラメータが値渡しの関数 function func1($param) { $param = "test data1"; } // パラメータが参照渡しの関数 function func2(&$param) { $param = "test data2"; } // 値渡しの関数に値でパラメータを渡す $param = "test"; func1($param); // 関数内の変更は反映されない var_dump($param); // string(4) "test" // 値渡しの関数に参照でパラメータを渡す $param = "test"; func1(&$param); // 関数内の変更は反映される var_dump($param); // string(10) "test data1" // 参照渡しの関数に値でパラメータを渡す $param = "test"; func2($param); // 関数内の変更は反映される var_dump($param); // string(10) "test data2" // 参照渡しの関数に参照でパラメータを渡す $param = "test"; func2(&$param); // 関数内の変更は反映される var_dump($param); // string(10) "test data2"
人によって意見が分かれることもあるとは思いますが、書き方などは統一しておくことが良いのではないかと思います。C言語のポインタやダブルポインタの雰囲気と似てるような気もしましたが、やはり(特に)型がないため、全く別物だと思います。
おそらく、参照を強制する場合は、関数のパラメータを参照にする点については同じ意見が多数派であるような気がします。しかし、関数が値渡しの時に参照渡しでパラメータを与えると呼び出し元にも変更が反映される点については使い方で意見が割れるような気がします。
意見が割れるとは、「PHP では出来てしまう」という点については仕方ないですが、そのような使い方や設計を「認めるか・認めないか」と言う点です。わたしは「認めない」に1票入れておきます。理由はありがちかもしれませんが、使い手が、関数内部の動作を把握している必要があるためです。また、関数内部を変更する必要に迫られると、修正も関数の使われ方を意識して行う必要がでてきます。
あなたはどのように思われますか?