Вы вызываете деструктор вручную; но это не значит, что вы удаляете объект. Вы просто вызываете метод, и этот метод просто , как и любой другой.
Вызов $b->__destruct()
вызывает деструктор $b->this_
, потому что $b
не имеет явного метода деструктора.
Когда сценарий завершается, Zend Engine вызывает все созданные объекты их деструкторы, а затем выполняет обычную очистку, которая включает вызов деструкторов содержащихся объектов, т. Е. После уничтожения $b
, $b->this_
должен быть очищен и, для этого Engine автоматически вызывает конструктор.
Обратите внимание, что второй вызов не из-за уничтожения $b
, а из-за уничтожения экземпляра A
.
Нет НИКАКОГО препятствия в уничтожении объекта вручную, и он освобождает свои ресурсы (если объект не используется совместно, и тогда GC не уничтожит его, если на него больше нет ссылок; в PHP нет слабые ссылки ).
Пример работы GC:
http://codepad.org/7JDBoOKY
Объекты разрушаются до завершения кода. Если бы этого не было, порядок вывода был бы инвертирован.