首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象克隆与序列化

对象克隆与序列化
EN

Stack Overflow用户
提问于 2013-01-31 01:56:29
回答 1查看 423关注 0票数 1

我的目标是在发现死锁时以正确的方式重新启动InnoDB事务,有时对象中的数据在执行时会发生变化,我需要将其回滚回原来的状态。为此,我可能会使用对象克隆,但我对此并不确定,因为这些对象没有定义__clone()方法,也没有时间添加它们。从另一面看,这些对象在内部组成对象的情况非常罕见。

这是我的代码:

代码语言:javascript
复制
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;

}

另一种对象复制的方法是深度克隆:

代码语言:javascript
复制
unserialize(serialize($Object));

我还考虑将__clone()添加到所有这些包对象的父类中:

代码语言:javascript
复制
// php.net example
function __clone(){ 
    foreach($this as $name => $value){ 
        if(gettype($value)=='object'){ 
            $this->$name= clone($this->$name); 
        } 
    } 
} 

问题:是否可以在父级中使用clone并定义__clone(),或者我只需要序列化/取消序列化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-31 02:52:32

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

如果必须重写_clone__,则如果序列化,则必须重写_sleep__wakeup (取决于对象)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14617219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档