<?php
class my_class
{
public $var1;
public $var2;
public $var3;
private $data;
public function __construct()
{
$this->data = new stdClass;
$this->data->var1 = 'a';
$this->data->var2 = 'b';
$this->data->var3 = 'c';
$this->assignReferences();
}
public function makeClone()
{
unset($this->var1); // turns $this->data->var1 into non-reference unset($this->var2); // turns $this->data->var2 into non-reference unset($this->var3); // turns $this->data->var3 into non-reference
$clone = clone $this; // this code is the same
$clone->data = clone $clone->data; // as what would go into
$clone->assignReferences(); // __clone() normally
$this->assignReferences(); // undo the unset()s
return $clone;
}
private function assignReferences()
{
$this->var1 = &$this->data->var1;
$this->var2 = &$this->data->var2;
$this->var3 = &$this->data->var3;
}
}
$original = new my_class;
$new = $original->makeClone();
$new->var3 = 'd';
echo $original->var3; // Output Should Be "c"
PD9waHAKCmNsYXNzIG15X2NsYXNzCnsKICAgIHB1YmxpYyAkdmFyMTsKCiAgICBwdWJsaWMgJHZhcjI7CgogICAgcHVibGljICR2YXIzOwoKCXByaXZhdGUgJGRhdGE7CgkKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCgl7CgkgICAgJHRoaXMtPmRhdGEgPSBuZXcgc3RkQ2xhc3M7CgkgICAgJHRoaXMtPmRhdGEtPnZhcjEgPSAnYSc7CgkgICAgJHRoaXMtPmRhdGEtPnZhcjIgPSAnYic7CgkgICAgJHRoaXMtPmRhdGEtPnZhcjMgPSAnYyc7CgkgICAgJHRoaXMtPmFzc2lnblJlZmVyZW5jZXMoKTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIG1ha2VDbG9uZSgpCgl7CgkgICAgdW5zZXQoJHRoaXMtPnZhcjEpOyAgLy8gdHVybnMgJHRoaXMtPmRhdGEtPnZhcjEgaW50byBub24tcmVmZXJlbmNlCgkgICAgdW5zZXQoJHRoaXMtPnZhcjIpOyAgLy8gdHVybnMgJHRoaXMtPmRhdGEtPnZhcjIgaW50byBub24tcmVmZXJlbmNlCgkgICAgdW5zZXQoJHRoaXMtPnZhcjMpOyAgLy8gdHVybnMgJHRoaXMtPmRhdGEtPnZhcjMgaW50byBub24tcmVmZXJlbmNlCgkKCSAgICAkY2xvbmUgPSBjbG9uZSAkdGhpczsgICAgICAgICAgICAgICAvLyB0aGlzIGNvZGUgaXMgdGhlIHNhbWUKCSAgICAkY2xvbmUtPmRhdGEgPSBjbG9uZSAkY2xvbmUtPmRhdGE7ICAvLyBhcyB3aGF0IHdvdWxkIGdvIGludG8KCSAgICAkY2xvbmUtPmFzc2lnblJlZmVyZW5jZXMoKTsgICAgICAgICAvLyBfX2Nsb25lKCkgbm9ybWFsbHkKCQoJICAgICR0aGlzLT5hc3NpZ25SZWZlcmVuY2VzKCk7IC8vIHVuZG8gdGhlIHVuc2V0KClzCgkgICAgcmV0dXJuICRjbG9uZTsKCX0KCQoJcHJpdmF0ZSBmdW5jdGlvbiBhc3NpZ25SZWZlcmVuY2VzKCkKCXsKCSAgICAkdGhpcy0+dmFyMSA9ICYkdGhpcy0+ZGF0YS0+dmFyMTsKCSAgICAkdGhpcy0+dmFyMiA9ICYkdGhpcy0+ZGF0YS0+dmFyMjsKCSAgICAkdGhpcy0+dmFyMyA9ICYkdGhpcy0+ZGF0YS0+dmFyMzsgICAgICAgIAoJfQp9Cgokb3JpZ2luYWwgPSBuZXcgbXlfY2xhc3M7CiRuZXcgPSAkb3JpZ2luYWwtPm1ha2VDbG9uZSgpOwokbmV3LT52YXIzID0gJ2QnOyAKCmVjaG8gJG9yaWdpbmFsLT52YXIzOyAvLyBPdXRwdXQgU2hvdWxkIEJlICJjIg==