我正在尝试克隆一个具有attribut的stdClass对象,该对象是一个DateTime。但它失败了。看起来克隆不起作用。我应该编写自己的__clone()方法吗? 这有什么不对?
代码:
$object = new stdClass;
$object->date = new DateTime();
var_dump($object->date);
$cloned = clone($object);
$object->date->modify('+1 day');
var_dump($cloned->date);
输出:
object DateTime (
->date = string (19) '2013-04-11 11:54:00'
->timezone_type = int 3
->timezone = string (13) 'Europe/Berlin'
object DateTime (
->date = string (19) '2013-04-12 11:54:00'
->timezone_type = int 3
->timezone = string (13) 'Europe/Berlin'
答案 0 :(得分:8)
如何通过强制链接“克隆”php POSCO (Plain Old StdClass对象):
$cloneObj = (object) (array) $myPOSCO;
var_dump($cloneObj == $myPOSCO); // true
var_dump($cloneObj === $myPOSCO); // false
答案 1 :(得分:4)
克隆对象时,所有对象属性都只是复制到对象的新实例。实际上是这样的:
$cloned = new stdClass;
$cloned->date = $object->date;
您可能知道,将对象分配给另一个变量不会复制该对象;仍然只有一个对象,现在有两个引用它。
要深度克隆对象,您需要使用__clone
method并手动clone
实现自定义类的任何子对象。
答案 2 :(得分:-1)
还有另一个更简单的选择:
$object = new stdClass;
$object->date = new DateTime();
var_dump($object->date);
$cloned = clone $object;
$object->date->modify('+1 day');
var_dump($cloned->date);
var_dump($object->date);
输出必须为:
object DateTime (
->date = string (19) '2013-04-11 11:54:00'
->timezone_type = int 3
->timezone = string (13) 'Europe/Berlin'
object DateTime (
->date = string (19) '2013-04-11 11:54:00'
->timezone_type = int 3
->timezone = string (13) 'Europe/Berlin'
object DateTime (
->date = string (19) '2013-04-12 11:54:00'
->timezone_type = int 3
->timezone = string (13) 'Europe/Berlin'