php5 и class suicide

camka

не самка
php5 и class suicide

PHP:
<?php
class aa
{
	public $prop = null;
		
	function zz()
	{
		$this->prop = &$this;
		$this->prop = null;
	}
}

$aa = new aa();
echo '<pre>';
var_dump($aa);
$aa->zz();
var_dump($aa);
?>
Код:
object(aa)#1 (1) {
  ["prop"]=>
  NULL
}
object(aa)#1 (1) {
  ["prop"]=>
  NULL
}
Этот скрипт выводит живой объект аа.

PHP:
<?php
class aa
{
	public $prop = null;
		
	function zz()
	{
		//$this->prop = &$this;
		$this->prop = null;
	}
}

$aa = new aa();
$aa->prop = &$aa;
echo '<pre>';
var_dump($aa);
$aa->zz();
var_dump($aa);
?>
Код:
object(aa)#1 (1) {
  ["prop"]=>
  object(aa)#1 (1) {
    ["prop"]=>
    *RECURSION*
  }
}
NULL
Этот же код успешно убивает объект аа.

Объяснить пожалуйста в чем разница? ссылка то вроде как на один и тот же объект, но в одном случае он удаляется, в другом остается.
 

su1d

Старожил PHPClubа
а зачем тебе в РНР5 "&" для присваивания объектов?
 

camka

не самка
вот именно для этого и нужно, чтоб удалять объекты через свойства и методы. реализую класс дерева, столкнулся с проблемой, что при переносе ветки, когда удаляю у пэрэнта ссылку на себя, сам самоуничтожаюсь. обошел это хитрым переопределением ссылки пэрента на фиктивный узел.

$ff = null;
$this->parent->first_child = &$ff;

Поскольку задачу свою решил, остался просто здоровый (или не очень) интерес к вопросу в первом посте. Заранее благодарствую.
 

Screjet

Новичок
Попробуй такой способ:
PHP:
class A {

    var $a;

    function A( &$a ){
        $this->a = &$a;
    }
    function destroy(){
        $this->a = null;
    }
}

$a = new A( $a );
var_dump($a);
$a->destroy();
var_dump($a);
Правда с конструктора все равно невозможен суицид:)
 

Profic

just Profic (PHP5 BetaTeam)
Все правильно :)
$this - в php5 особая переменна. Она не обозначает никакого КОНКРЕТНОГО объекта. Это, так сказать, ссылка на текущий объект. И живет она только то время, пока работает метод данного объекта. При следующем вызове она пересоздается снова из оригинала. Поэтому в первом случае метод даже "уничтожает" объект, но только пока он работает :)
(Я знаю что это довольно обощенный вариант, но думаю более понятный :))

Во втором же случае происходит установка РЕАЛЬНОМУ объекту, на который ссылается свойство NULL.
 

camka

не самка
Хитро. Однако, не достаточно логичто по-моему. Благодарю за разъяснение. Будем учитывать в следующий раз.
 
Сверху