【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システム開発・ネットワーク構築会社 コネクティボへ
