试图克隆一个 stdClass
Posted
技术标签:
【中文标题】试图克隆一个 stdClass【英文标题】:Trying to clone a stdClass 【发布时间】:2013-04-03 11:22:57 【问题描述】:我正在尝试克隆一个具有 DateTime 属性的 stdClass 对象。但它失败了。看起来克隆不起作用。我应该编写自己的 __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'
【问题讨论】:
为什么不呢?后天(11 日对 12 日) 【参考方案1】:如何通过强制转换链接“克隆”一个 php POSCO(普通旧 StdClass 对象):
$cloneObj = (object) (array) $myPOSCO;
var_dump($cloneObj == $myPOSCO); // true
var_dump($cloneObj === $myPOSCO); // false
【讨论】:
对我不起作用,仍然引用原始 obj?【参考方案2】:当克隆一个对象时,所有的对象属性都被简单地复制到一个新的对象实例中。实际上是这样的:
$cloned = new stdClass;
$cloned->date = $object->date;
您可能知道,将一个对象分配给另一个变量并不会复制该对象;仍然只有一个对象,现在有两个对它的引用。
要深度克隆一个对象,您需要使用__clone
method 实现一个自定义类,并手动clone
它的任何子对象。
【讨论】:
有一个肮脏的黑客来深度克隆一个stdClass:$cloned = unserialize(serialize($object));【参考方案3】:还有一个更简单的选择:
$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'
【讨论】:
看,我仔细检查了这个答案并为我工作,所以我不会删除这个答案,因为可以帮助别人。以上是关于试图克隆一个 stdClass的主要内容,如果未能解决你的问题,请参考以下文章
PHP SoapClient参数仅在我使用StdClass时才有效