php - PHP對象分配 vs 克隆

  显示原文与译文双语对照的内容
125 2

我知道這在php文檔中被覆蓋了,但是我對這個問題。

從php文檔中:

$instance = new SimpleClass();
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned will have this value';
$instance = null;//$instance and $reference become null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

上面的示例將輸出:

NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
 string(30)"$assigned will have this value"
}

好的,所以我看到,$assigned 原來的對象( $instance ) 被分配給 null,所以顯然 $assigned 不是引用,而是 $instance.的一個副本。

那麼有什麼區別呢

 $assigned = $instance 

 $assigned = clone $instance
时间: 原作者:

55 1

對象是內存中的抽象數據。變數總是在內存中保存對該數據的引用 。想象一下$foo = new Bar在內存中創建一個 Bar的對象實例,指定一些 #42$foo 將這裡 #42 作為對這裡對象的引用。根據引用或者通常工作方式將這裡引用指定給其他變數,與其他任何值相同。許多變數可以保存這裡引用的副本,但所有變數都指向相同的對象。

clone 顯式創建對象本身的副本,而不僅僅是指向指向對象的引用。

$foo = new Bar;//$foo holds a reference to an instance of Bar
$bar = $foo;//$bar holds a copy of the reference to the instance of Bar
$baz =& $foo;//$baz references the same reference to the instance of Bar as $foo

不要像在 =& 中那樣將"引用"與"引用"混淆,因為對象標識符 。

$blarg = clone $foo;//the instance of Bar that $foo referenced was copied
//into a new instance of Bar and $blarg now holds a reference
//to that new instance
原作者:
55 0

兩者之間的區別

 $assigned = $instance 

 $assigned = clone $instance

你使用克隆關鍵字,你可以使用魔法方法 __clone(),這可以讓你更好的控制對象克隆。從php手冊中:

克隆完成後,如果定義了 __clone() 方法,則調用新創建的對象方法,以允許所有必需的屬性。

如果要創建對象副本,則 PHP 5中的對象會被引用。如果要創建對象副本,請使用克隆

來自手冊:

PHP引用是一個別名,它允許兩個不同的變數寫入相同的值。在 PHP 5中,對象變數不再包含對象本身作為值。它只包含一個對象標識符,它允許對象訪問器找到實際對象。通過參數發送,返回或者分配給另一個變數時,不同的變數不是別名:它們保存了標識符的副本,該標識符指向相同的對象。

原作者:
...