Как сделать ссылку на свойство родительского объекта в клонированном объекте в PHP 5.3? - PullRequest
1 голос
/ 22 сентября 2011

Я хочу сделать это:

class T
{
    public $a;
    public $b;
    public function __construct()
    {
        $this->a = new P;
        $this->b = clone $this->a;
    }
}

class P
{
    public $name ="Chandler";
    public function __clone()
    {
        $this->name = & $that->name;
    }

}

$tour = new T;
$tour->a->name = "Muriel";

?>

Но после этого $tour->b->name будет NULL, почему?
Как сделать ссылку на свойство клона name на родительскийсвойство объекта name, поэтому при изменении родительского объекта name клонированный объект name изменится соответственно?

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

С клонирования php.net Страница справочника ,

Когда объект клонируется, PHP 5 выполнит поверхностную копию всех свойства объекта. Любые свойства, которые являются ссылками на другие переменные, останутся ссылками.

, но $name - это скалярная переменная (строка), а не объект. Поэтому, когда вы клонируете $a в $b, $a->name и $b->name являются различными переменными. т.е.) $b->name не ссылается $a->name

Короче говоря, я не верю, что это возможно (пожалуйста, поправьте меня, если я ошибаюсь). Тем не менее, вы можете обмануть и сделать что-то вроде:

class P
{
    public $name;
    public function __construct(){
        $this->name = new StdClass();
        $this->name->text = 'Chandler';
    }   
}

Тогда $a->name->text = 'Muriel'; также изменится $b->name->text.

0 голосов
/ 13 октября 2011

$that не существует в функции __clone, как сказано в книге Джорджа Шлосснагла: книга по расширенному программированию на PHP ... Это дало мне пару недель головной боли ... Итак, вы можете сделать это с помощью простого трюка в конструкторе (в классе P); сделать переменную ссылку на себя:

function __construct()
{
    $this->name = & $this->name;
}

это работает в PHP 5.3.6. Я не проверял это в других версиях. Поэтому, когда вы делаете $tour->a->name = "Muriel";, $tour->b->name тоже будет "Мюриэль"!

...