PHPでの関数への参照渡し


「3.4.2参照渡しのパラメータ」からのメモ。


関数へ参照渡しで引数を渡す場合は本には以下の方法が書いてありました。

<?php
function up(&$num)
{
  $num++;
}

$hoge = 10;
up($hoge);
echo "\$hoge = $hoge\n";
?>
$hoge = 11

関数定義の引数リスト側(&$num)に&をつけ、関数呼び出し側($hoge)には何もつけないというところに少し違和感を覚えました。本で解説されていた変数にポインタを渡す場合の書き方とは逆になります。

$num = &$hoge;


そこで以下の2通りの書き方でも動作するのか確かめてみました。

  • 呼び出し側に&をつける
<?php
function up($num)
{
  $num++;
}

$hoge = 10;
up(&$hoge);
echo "\$hoge = $hoge\n";
?>
$hoge = 11
  • 呼び出し側、定義側の両方に&をつける
<?php
function up(&$num)
{
  $num++;
}

$hoge = 10;
up(&$hoge);
echo "\$hoge = $hoge\n";
?>
$hoge = 11




どの書き方でも参照渡しとなりました。じゃあどの書き方がいいんだろうか。必ず参照渡しにしたいときは関数定義側がいいけど、それだと呼び出し側からは参照渡しなのか値渡しなのかわからないからハマることがあるかも。。。関数定義側と呼び出し側の双方が参照渡しにしなければならないような書き方があれば一番いいようなきがするなー。
ちなみにRubyではすべてが参照渡しだったので、割り切って考えることができます。
(正確には変数のポインタを渡すのではなく、インスタンスのポインタを渡す値渡しということだったかな)