Метод __destruct класса вызывается, когда все ссылки на объект не установлены.
Например
$dummy = (object) new Class();
Деструктор вызывается автоматически, если фиктивный объект имеет значение null или сценарий завершается.
unset($dummy); // or $dummy = null;
//exit(); //also possible
Однако для вызова метода деструктора есть три важных замечания:
Во-первых, метод desctructor должен быть открытым, не защищенным или закрытым.
Во-вторых, воздерживаться от использования внутренних и циклических ссылок. Например:
class NewDemo
{
function __construct()
{
$this->foo = $this;
}
function __destruct()
{
// this method will never be called
// and cause memory leaks
// unset will not clear the internal reference
}
}
Следующее также не будет работать:
$a = new Class();
$b = new Class();
$a->pointer = $b;
$b->pointer = $a;
unset($a); // will not call destructor
unset($b); // will not call destructor
В-третьих, решить, будут ли вызываться деструкторы после отправки вывода. Использование
gc_collect_cycles()
можно определить, все ли деструкторы вызываются перед отправкой данных пользователю.
См. http://php.net/manual/en/language.oop5.decon.php об источниках и подробных объяснениях методов магического разрушения с примерами.