Affamative Way

前向きにグダグダいいながらコード書く

参照渡し(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エラーにひっかかりますね