我的目标是在发现死锁时以正确的方式重新启动InnoDB事务,有时对象中的数据在执行时会发生变化,我需要将其回滚回原来的状态。为此,我可能会使用对象克隆,但我对此并不确定,因为这些对象没有定义__clone()方法,也没有时间添加它们。从另一面看,这些对象在内部组成对象的情况非常罕见。
这是我的代码:
protected function callAction() {
$action = $this->Method.'Action';
// Storing an Object
$SavedPackageObject = clone $this->PackageObject;
try {
// First attempt
$res = $this->PackageObject->$action();
} catch(MySQLiDeadlockException $e) {
$i = 0;
do {
// Restoring an Object
$this->PackageObject = clone $SavedPackageObject;
try {
$res = $this->PackageObject->$action();
// Success
break;
} catch(MySQLiDeadlockException $e) {
// Cancel iterations if limit is reached
if($i > 9)
throw $e;
usleep(100000);
$i++;
}
} while(1);
}
return $res;
}另一种对象复制的方法是深度克隆:
unserialize(serialize($Object));我还考虑将__clone()添加到所有这些包对象的父类中:
// php.net example
function __clone(){
foreach($this as $name => $value){
if(gettype($value)=='object'){
$this->$name= clone($this->$name);
}
}
} 问题:是否可以在父级中使用clone并定义__clone(),或者我只需要序列化/取消序列化?
发布于 2013-01-31 02:52:32
对于您正在做的事情,clone是最有意义的,而且应该是最有效的。我想不出将对象序列化为字符串有什么好处,只是为了不序列化它以恢复它的状态。
如果必须重写_clone__,则如果序列化,则必须重写_sleep和__wakeup (取决于对象)。
https://stackoverflow.com/questions/14617219
复制相似问题