Php 对象克隆与序列化

Php 对象克隆与序列化,php,serialization,clone,Php,Serialization,Clone,我的目标是在发现死锁时以正确的方式重新启动InnoDB事务,有时,对象中的数据在执行时发生变化,我需要将其回滚到以前的状态。为此,我可能会使用对象克隆,但我不能百分之百确定,因为这些对象没有定义\uu clone()方法,我没有时间添加它们。从另一个角度看,这些物体内部很少有合成物体 这是我的密码: protected function callAction() { $action = $this->Method.'Action'; // Storing an Obje

我的目标是在发现死锁时以正确的方式重新启动InnoDB事务,有时,对象中的数据在执行时发生变化,我需要将其回滚到以前的状态。为此,我可能会使用对象克隆,但我不能百分之百确定,因为这些对象没有定义
\uu 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));
我还考虑将
\uu clone()
添加到所有这些包对象的父类中:

// php.net example
function __clone(){ 
    foreach($this as $name => $value){ 
        if(gettype($value)=='object'){ 
            $this->$name= clone($this->$name); 
        } 
    } 
} 

问题:可以使用
clone
并在父级中定义
\uu clone()
,还是我可以序列化/取消序列化?

对于您正在做的事情,
clone
最有意义,应该是最有效的。我想不出将对象序列化为字符串有什么好处,只是取消序列化以恢复其状态


我假设如果你必须覆盖
\u clone
,你必须覆盖
\u sleep
\u wakeup
(取决于你的对象)如果序列化?

对于你正在做的事情,
clone
是最有意义的,应该是最有效的。我想不出将对象序列化为字符串有什么好处,只是取消序列化以恢复其状态


我假设如果你必须重写
\u clone
,你必须重写
\u sleep
\u wakeup
(取决于你的对象)如果序列化?

是的,这是正确的。我已经在parent中添加了_clone(),它就像一个符咒。是的,没错。我在parent中添加了_clone(),它就像一个符咒。