区别
$assigned = $instance
和
$assigned = clone $instance
在第一种情况下,您分配了现有对象的引用,在第二种情况下,您创建了一个新对象并将其分配给变量。
此外,当您使用 clone 关键字时,您可以使用魔术方法__clone(),这样可以更好地控制对象克隆。从 php 手册:
克隆完成后,如果定义了__clone() 方法,则将调用新创建对象的 __clone() 方法,以允许需要更改的任何必要属性。
从手册:
PHP 引用是一个别名,它允许两个不同的变量写入相同的值。从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,该标识符允许对象访问器查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们保存指向同一对象的标识符的副本。
让我举一个活生生的例子
$dateA = new \Datetime('2017-04-04');
$dateB = $dateA; // $dateB references exactly the same object as $dateA
$dateB->modify('+1 day');
var_dump($dateA->format('Y-m-d')); //string(10) "2017-04-05"
var_dump($dateB->format('Y-m-d')); //string(10) "2017-04-05"
// $dateA is still modified by the code above so it has 2017-04-05
$dateC = clone $dateA; // we clone $dateA so it's a new object
$dateC->modify('+1 day');
var_dump($dateA->format('Y-m-d')); // string(10) "2017-04-05"
var_dump($dateC->format('Y-m-d')); // string(10) "2017-04-06"
日期时间的旁注 我建议使用日期时间不可变而不是日期时间
编辑:内部类型
// create 2 integer variables $a and $b
$a = 1;
$b = 1;
// create a new $c variable and assign the *value* of $a to that variable
$c = $a;
// create a new $d variable and assign a reference to $b variable
$d = &$b;
// increment $b, $c and $d variables
$b++;
$c++;
$d++;
echo $a; // 1
echo $b; // 3
echo $c; // 2
echo $d; // 3
因为$d引用$b当我们增加其值时,它也将更改$b的值。
内部对象(如字符串,int,float等)之间的区别在于它们按值传递,而对象默认通过引用传递。
注意:不能对内部对象使用克隆。