Php 在_uclone()中获取原始/源实例

Php 在_uclone()中获取原始/源实例,php,clone,Php,Clone,在php中是否有可能在\uu clone方法中获取原始源实例/对象 不保存$this或之前的哈希/id 我尝试使用$this和backtrace,但两者都返回新的/克隆的实例 class Cl { public function __clone() { var_dump(spl_object_id(debug_backtrace()[0]['object'])); // returns int(2) var_dump(spl_object_id($this

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

不保存
$this
或之前的哈希/id

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

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)
克隆完成后,如果定义了
\uuuu clone()
方法,则将调用新创建对象的
\uuu clone()
方法,以允许更改任何必要的属性

如上所述,您可以设置原始对象实例并使用:

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)

克隆完成后,如果定义了
\uuu clone()
方法,则将调用新创建的对象的
\uu clone()
方法,以允许更改任何必要的属性。。所以,
$这个
是新的克隆对象。看起来你不能按你想要的方式做。您可以做的是将实例添加到一些类属性中,如
$this->original=$this
,然后在
\uu clone()
中可以访问
$this->original
。或者您可以将克隆委托给另一个类,该类可以访问这两个对象(但不使用
clone$obj
)。您放弃了吗?不,我实际上在考虑将PR委托给php src,因为如果在克隆之前没有
$this
备份,当前在php中似乎不可能这样做