Вызов деструктора при перепресвоении переменной с объектом

weregod

unserializer
PHP:
class Foo
{
    protected static $uidStatic = 0;

    protected $uid;

    public function __construct()
    {
        ++self::$uidStatic;
        $this->uid = self::$uidStatic;
        echo sprintf("%s: %d\n", __METHOD__, $this->uid);
    }

    public function __destruct()
    {
        echo sprintf("%s: %d\n", __METHOD__, $this->uid);
    }
}

$foo = new Foo;
unset($foo);

$foo = new Foo;
$foo = new Foo;
выводит
Код:
Foo::__construct: 1
Foo::__destruct: 1
Foo::__construct: 2
Foo::__construct: 3
Foo::__destruct: 2
Foo::__destruct: 3
зря ожидал
Код:
...
Foo::__construct: 2
Foo::__destruct: 2
Foo::__construct: 3
Foo::__destruct: 3
без явного unset() ?
 

AnrDaemon

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

AnrDaemon

Продвинутый новичок
Типа, бу дизайн.
Ты не unset() объект - почему должен вызываться деструктор?
 

Вурдалак

Продвинутый новичок
Видимо они не отслеживают факт переопределения переменной.

Сборщик мусора не обязан подчиняться «логичным» правилам, когда кажется, что объект обязан быть уничтожен, он должен соблюдать баланс между количеством проверок (чтобы существенно не упала производительность) и потребляемой памятью.
 
Сверху