首页 > 解决方案 > 在 __clone() 中获取原始/源实例

问题描述

php中是否有可能在__clone方法中获取原始源实例/对象?

没有保存$this或者之前是哈希/ID。

我尝试使用$this和回溯,但都返回新/克隆的实例。

class Cl
{
    public function __clone() {
        var_dump(spl_object_id(debug_backtrace()[0]['object'])); // returns int(2)
        var_dump(spl_object_id($this)); // returns int(2)
        
        // how to get the original/source instance, ie. int(1), here?
    }
}


$cl = new Cl();
var_dump(spl_object_id($cl)); // returns int(1)
var_dump(spl_object_id(clone $cl)); // returns int(2)

标签: phpclone

解决方案


克隆完成后,如果__clone()定义了方法,则将调用新创建的对象的__clone()方法,以允许任何需要更改的必要属性。

正如Felippe Duarte提到的,您可以设置原始对象实例并使用它:

class Cl
{
    //private $original;
    
    public function __construct() {
        $this->original = $this;
    }
    public function __clone() {
        var_dump(spl_object_id($this->original)); // returns int(1)
    }
}

$cl = new Cl();
var_dump(spl_object_id($cl)); // returns int(1)
var_dump(spl_object_id(clone $cl)); // returns int(2)

推荐阅读