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

  • Автор темы Автор темы weregod
  • Дата начала Дата начала

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() ?
 
Зря. Сбор мусора происходит только когда ты его явно вызываешь (i.e. unset()), либо при завершении скрипта.
В остальное время просто изменяется счётчик ссылок на переменную.
 
Типа, бу дизайн.
Ты не unset() объект - почему должен вызываться деструктор?
 
Видимо они не отслеживают факт переопределения переменной.

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