【PHP5】 今更と言えば今更な話

2007.11.06 Author: たわばがに

今回は珍しく PHP のお話です。

PHP4のサポートが年内で終了するということで、
PHP4からPHP5への民族大移動が始まっている季節?なわけですが、
PHP4からPHP5に移行する際、注意点の一つとして、
オブジェクトのコピー方法が変わる、という話が取り上げられています。

簡単に書くと、
「これまで値渡しだったものが、参照渡しになる」ということなのですが、
この解釈を適用する範囲を間違えると、えらいことになります。

ここで簡単な例を挙げてみましょう。
<?php

class hoge {
    public $head = "ふさふさ";
    function hage() {
        $this->head = "ハゲ";
    }
}

$oyaji = new hoge;
$musuko = $oyaji;

$oyaji->hage();

echo $oyaji->head;
echo $musuko->head;
このスクリプトをPHP5の環境で実行すると、「ハゲハゲ」と出力されます。
$musuko = $oyaji でオブジェクトが値渡しではなく、参照渡しで渡されているため、
$oyaji->hage() を実行した時点で $musuko->head も $oyaji->head と同じことになるわけです。

PHP4の環境では public のみ var に置き換えないとエラーになります。
こちらの場合は、実行すると「ハゲふさふさ」と出力されます。
これは $musuko = $oyaji 実行の際、オブジェクトが値渡しで渡っているためです。
なら、次の例ではどうなるでしょうか?
<?php

$c = array("h" => 9);
$b = array("a" => 1, "b" => 2);

$c = $b;

$b = array("g" => 1, "f" => 2);

print_r($c);
上記オブジェクトコピーの結果をふまえた上で考えると、
PHP5環境での出力結果は Array ( [g] => 1 [f] => 2 ) となりそうですが、
実際は Array ( [a] => 1 [b] => 2 ) となります。
そう。PHP4環境と同じ結果になります。

つまるところ、普通の変数や配列は、これまで同様 = で結ぶと値渡しで渡されるわけです。
変数や配列をオブジェクトと混同すると、悲劇大事件の始まりです。
勘違いして clone メソッドなぞ使おうものなら、更に惨劇ステキなことになります。

ということで、紛らわしいなぁ気をつけましょうね。
名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ