ホーム > PHP > オブジェクトに対する代入演算子の挙動の違い

オブジェクトに対する代入演算子の挙動の違い

[`evernote` not found]
[`grow` not found]
[`livedoor` not found]
[`yahoo` not found]
Delicious にシェア
このエントリーをはてなブックマークに追加

PHPの基礎体力でお世話になっているレンタルサーバー屋さんが
PHP5環境を用意してくれたので、只今PHPの基礎体力をPHP5に移行作業中です。
PHP4とPHP5で違うところをメモっておきます。

PHP4 では、オブジェクトを複製する時は = で、
リファレンスの時は =& 演算子を使いました。

/**
 * PHP4
 */
$object1 = new stdClass; 

// $object2を$object1の複製で初期化
$object2 = $object1;

// $object3を$object1のリファレンスで初期化
$object3 =& $object1;

これがPHP5になると、オブジェクトを複製する時は = clone
リファレンスの時は = となるので
複製のつもりで代入演算子を使ってるところは = clone に直す必要あり。

/**
 * PHP5
 */
$object1 = new stdClass; 

// $object2を$object1の複製で初期化
$object2 = clone $object1;

// $object3を$object1のリファレンスで初期化
$object3 = $object1;

ちなみに、PHP5で $object3 =& $object1 とした場合は、
$object3 = $object1 と同じ挙動のようです。

$object1 = new stdClass;

$object2 = clone $object1;
$object3 = $object1;
$object4 =& $object1;

$object5 = $object2;

debug_zval_dump($object1);
debug_zval_dump($object2);
debug_zval_dump($object3);
debug_zval_dump($object4);
debug_zval_dump($object5);

上の出力結果が下です。
こんな時のデバッグプリントは debug_zval_dump が役立ちます。

object(stdClass)#1 (0) refcount(1){
}
object(stdClass)#2 (0) refcount(3){
}
object(stdClass)#1 (0) refcount(2){
}
object(stdClass)#1 (0) refcount(1){
}
object(stdClass)#2 (0) refcount(3){
}

$object =& new stdClass;
それとインスタンスの生成時↑のような書き方をすることがあったけど
= でリファレンスが得られるので、PHP5では & が不要ってことになる。

コメント:0

コメントフォーム
入力した情報を記憶する
accessLogging

ホーム > PHP > オブジェクトに対する代入演算子の挙動の違い

Ad
Apache
MySQL
PHP
お気に入り
ん。。。。。。広告
アーカイブ
Ad

ページの上部に戻る