【PHP5】 今更と言えば今更な話
2007.11.06 Author: たわばがに
今回は珍しく PHP のお話です。
PHP4のサポートが年内で終了するということで、
PHP4からPHP5への民族大移動が始まっている季節?なわけですが、
PHP4からPHP5に移行する際、注意点の一つとして、
オブジェクトのコピー方法が変わる、という話が取り上げられています。
PHP4のサポートが年内で終了するということで、
PHP4からPHP5への民族大移動が始まっている季節?なわけですが、
PHP4からPHP5に移行する際、注意点の一つとして、
オブジェクトのコピー方法が変わる、という話が取り上げられています。
簡単に書くと、
「これまで値渡しだったものが、参照渡しになる」ということなのですが、
この解釈を適用する範囲を間違えると、えらいことになります。
ここで簡単な例を挙げてみましょう。
$musuko = $oyaji でオブジェクトが値渡しではなく、参照渡しで渡されているため、
$oyaji->hage() を実行した時点で $musuko->head も $oyaji->head と同じことになるわけです。
PHP4の環境では public のみ var に置き換えないとエラーになります。
こちらの場合は、実行すると「ハゲふさふさ」と出力されます。
これは $musuko = $oyaji 実行の際、オブジェクトが値渡しで渡っているためです。
なら、次の例ではどうなるでしょうか?
PHP5環境での出力結果は Array ( [g] => 1 [f] => 2 ) となりそうですが、
実際は Array ( [a] => 1 [b] => 2 ) となります。
そう。PHP4環境と同じ結果になります。
つまるところ、普通の変数や配列は、これまで同様 = で結ぶと値渡しで渡されるわけです。
変数や配列をオブジェクトと混同すると、悲劇大事件の始まりです。
勘違いして clone メソッドなぞ使おうものなら、更に惨劇ステキなことになります。
ということで、紛らわしいなぁ気をつけましょうね。
名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ
「これまで値渡しだったものが、参照渡しになる」ということなのですが、
この解釈を適用する範囲を間違えると、えらいことになります。
ここで簡単な例を挙げてみましょう。
<?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システム開発・ネットワーク構築会社 コネクティボへ