<?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
)
)