Posted at

PHPの参照について

More than 5 years have passed since last update.

参考: PHPの参照渡しは関数の引数だけじゃない - cloned.log

ポイントは3つ。

- 関数/メソド引数の参照渡し

- 代入の参照代入

- 関数/メソドの参照返し


引数の参照渡し

 個人的にはこれもよく忘れるのです。仮引数に&か実引数に&か非常にややこしい気がする。

$v = "default";

rewrite($v);
print $v;

function rewrite(&$arg) {
$arg = "HelloWorld";
}


関数/メソドの参照返し

 この辺は動的プログラミングとかで地味に効いてくる。

$hoge = "this is hoge";

function &fuga() {
return $this->value;
}

$fuga =& fuga();
$fuga = "this is fuga";
var_dump($hoge);//"this is fuga";

 関数名と返り値取得の両方に&が必要、との事。クラスで可変となるプロパティ部にアクセサつけたりとかそういう感じの時何かと便利。

 受け取るときに&抜いたら参照じゃなくなる辺りとかも便利だと思う。


参照渡し

 最後に、参照を代入で渡すこともできる。が、まぁあんまり使うことはないとは思う。

$hoge = "this is hoge";

$fuga =& $hoge;
$fuga = "this is fuga";
var_dump($fuga);

 ちなみにforeachとかも参照で受け取れる。渡した値を変更する時、とか$arr[$key]ってすること多そうだけど、アレだと$value側が浮く。それだけの為にわざわざarray_keysとか使うのもあれだしねぇ

foreach($arr as $key=>&$value)

{
$value = "new value";
//$arr[$key] = "new value"; // これだと$valueが浮く
}