参照渡し(Shallow copy)とコピー渡し(Deep copy)
PHP5だっていうのに、いまだにこういう書き方を見つけたのでまとめて見る。*1
<?php $obj =& $hoge->getObj(); ?>
まずはおさらい。
コピー渡しの場合
コピー渡しの場合は変数のそれぞれに対して、値を保持する。
<?php $arr = array(1,2,3,4,5); $arr2 = $arr; $arr2[0] = 0; echo $arr2[0] ."<br>"; // 0が出力される echo $arr[0] ."<br>"; // 1が出力される ?>
参照渡しの場合
参照渡しの場合の場合は値へのアドレスだけを保持するので
変数に割り当てられた値の存在は単一である。
<?php $arr = array(1,2,3,4,5); $arr2 =& $arr; $arr2[0] = 0; echo $arr2[0] ."<br>"; // 0が出力される echo $arr[0] ."<br>"; // 0が出力される ?>
オブジェクトの場合は・・・
ただし、PHP5以降はデータ型がオブジェクトの場合
変数へ格納する際は、参照渡しとなる。
<?php /** * 値を一つ保持するだけのクラス */ class Hoge{ var $v; function set($v){ $this->v = $v; } function get(){ return $this->v; } } $hoge = new Hoge(); $hoge->set(4); echo $hoge->get() ."<br>"; // 4 と出力される $hoge2 = $hoge; $hoge->set(5); echo $hoge2->get() ."<br>"; // 5 と出力される ?>
では、コピーしたい場合には「cloen」という関数を利用してやる。
<?php $hoge = new Hoge(); $hoge->set(4); echo $hoge->get() ."<br>"; // 4 と出力される $hoge2 = clone $hoge; $hoge->set(5); echo $hoge2->get() ."<br>"; //何も出力されない。 ?>
詳しくはこちら
○PHP Manual: オブジェクトのクローン作成
久々にマニュアルを見直してみると結構新たな発見がw
うまいこと使ったら便利なんだろうなぁ
PHP独自の書き方が多いから、チーム開発だと解る人少なくて辛そうだけどw
○PHP Manual: クラスとオブジェクト (PHP 5) -
*1:エラーレベルでstrictを有効にしていれば、strictエラーにひっかかりますね