PHP5ではオブジェクトのコピー方法が変更されました。
今までは、
$obj2 = $obj;
でオブジェクトがコピーされていました。
例えば、$obj にメンバ変数 name が設定されていたとしましょう。
$obj->name = "NETWORK";
$obj2 = $obj;
$obj2->name = "DATABASE";
のように $obj を $obj2 にコピーして $obj2->name を変更したとしても、$obj->name の値は NETWORK のままなのです。これは他のプログラミング言語(Java)などを使っていた方にとってはかなり気持ちの悪いものだったでしょう。
関数の引数としてオブジェクトを渡して、渡した先で値を変更しても何も変更されないままなのです。
$obj->name = "NETWORK";
change($obj);
function change($obj)
{
$obj->name = "DATABASE";
}
これを回避するには、
リスト1
$obj =& $obj2; // 変数の代入の場合
function change(&$obj) // 関数定義の場合
{
}
のようにする必要がありました。
オブジェクトの場合はどんな言語でも普通は参照渡しなので最初は戸惑った方が多いと思います。
これが、PHP5 では、
$obj = $obj2; // 変数の代入の場合
function change($obj) // 関数定義の場合
{
}
のように普通に記述しても上記
リスト1と同様の扱いになります。
逆に、PHP5でコピーを行うには、
$obj = clone $obj2;
のように __clone メソッドを使ってコピーを行うようになっています。
PHP4 で &〜 に慣れた方は別に構わないと思う方もいると思いますが、他言語からの移行などを考えてこのような変更が行われたのではないかと思います。
スポンサードリンク
もどる