php 對象賦值和引用的理解

<?php

$c1 = new myclass();

$c2 = $c1;

$c3 = &$c1;

$c1 = null;

var_dump($c1);

var_dump($c2);

var_dump($c3);

?>

output

NULL
object(myclass)#1 (1) { ["v1"]=> int(2) }
NULL

<?php

$c1 = new myclass();

$c2 = $c1;

$c3 = &$c1;

unset($c1);

var_dump($c1);

var_dump($c2);

var_dump($c3);

?>

output

NULL
object(myclass)#1 (1) { ["v1"]=> int(2) }
object(myclass)#1 (1) { ["v1"]=> int(2) }

標識符=>地址

$c1是個標識符

$c2也是個標識符 和$c1一樣 對應同一個地址

$c3是$c1的別名

$c1 = null

變量$c1依然存在 只是指示的內容變了

$c3跟着變

unset($c1);

銷燬變量$c1

但是$c3依然指向對象

如果要拷貝的對象引用了其他的對象資源,要實現深拷貝,必須實現自定義的__clone()方法,並在__clone方法中,對相關對象實現深拷貝。

Example #1 Cloning an object

<?php
class SubObject
{
static $instances = 0;
public $instance;

public function __construct(){
$this->instance =++self::$instances;
}

public function __clone(){
$this->instance =++self::$instances;
}
}

class MyCloneable
{
public $object1;
public $object2;

function __clone()
{
// Force a copy ofthis->object, otherwise
// it will pointto same object.
$this->object1 =clone $this->object1;
}
}

$obj =new MyCloneable();

$obj->object1 =new SubObject();
$obj->object2 =new SubObject();

$obj2 =clone $obj;


print("OriginalObject:\n");
print_r($obj);

print("ClonedObject:\n");
print_r($obj2);

?>

The above example will output:

Original Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)

[object2] => SubObject Object
(
[instance] => 2
)

)
Cloned Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)

[object2] => SubObject Object
(
[instance] => 2
)

)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章