我正在研究一个使用“克隆”关键字的现有框架,不确定这是否是一个好主意?我真的不明白需要使用'clone'关键字。
例如,看看这个编码即
public function getStartDate ()
{
return clone $this->startDate;
}
对我来说,这个功能应该如下,我没有看到克隆的需要。
public function getStartDate ()
{
return $this->startDate;
}
答案 0 :(得分:7)
使用克隆的原因是PHP在处理对象时始终将对象作为引用返回,而不是作为副本。
这就是为什么在将对象传递给函数时,您不需要使用& (参考):
function doSomethingWithObject(MyObject $object) { // it is same as MyObject &object
...
}
因此,为了获得对象副本,您必须使用clone关键字 这是关于php如何处理对象以及克隆做什么的示例:
class Obj {
public $obj;
public function __construct() {
$this->obj = new stdClass();
$this->obj->prop = 1; // set a public property
}
function getObj(){
return $this->obj; // it returns a reference
}
}
$obj = new Obj();
$a = $obj->obj; // get as public property (it is reference)
$b = $obj->getObj(); // get as return of method (it is also a reference)
$b->prop = 7;
var_dump($a === $b); // (boolean) true
var_dump($a->prop, $b->prop, $obj->obj->prop); // int(7), int(7), int(7)
// changing $b->prop didn't actually change other two object, since both $a and $b are just references to $obj->obj
$c = clone $a;
$c->prop = -3;
var_dump($a === $c); // (boolean) false
var_dump($a->prop, $c->prop, $obj->obj->prop); // int(7), int(-3), int(7)
// since $c is completely new copy of object $obj->obj and not a reference to it, changing prop value in $c does not affect $a, $b nor $obj->obj!
答案 1 :(得分:4)
也许startDate
是一个对象。
然后。当您返回clone $this->startDate
时 - 您将获得该对象的完整副本。您可以使用它,更改值,调用函数。并且,在它们影响数据库或文件系统之前 - 它是安全的,并且不会修改实际的startDate
对象。
但是,如果你只是按原样返回对象 - 你只返回一个引用。使用对象执行任何操作 - 使用原始对象执行此操作。您所做的任何更改 - 都会影响startDate
。
这仅适用于对象,不会影响数组,字符串和数字,因为它们是值类型变量。
您应该阅读有关值类型变量和引用类型变量的更多信息。
答案 2 :(得分:1)
尽管在another question中解释了这是完美的(感谢指出这个@gerald)
快速回答:
没有克隆,该函数返回对startDate对象的引用。随着克隆它返回一份副本。
如果稍后更改返回的对象,它只会更改副本而不是原始副本,也可能会在其他地方使用。