Почему, в этом коде PHP: <?php class Orator { private $name; function __construct($name){ $this->name = $name; echo 'Создан объект ' . $this->name . '<br>'; } function __destruct() { echo 'Уничтожен объект ' . $this->name . '<br>'; } } function outer(){ $obj = new Orator(__METHOD__); inner(); } function inner(){ $obj = new Orator(__METHOD__); echo 'Внимание, вбрасывание!<br>'; throw new Exception('Hello'); } echo 'Начало программы<br>'; try { echo 'Начало try-блока<br>'; outer(); echo 'Конец try-блока<br>'; } catch (Exception $e) { echo 'Исключение: ' . $e->getMessage() . '<br>'; } echo 'Конец программы<br>'; объект не сразу уничтожается? Ведь после конструктора, сразу указан деструктор. Сейчас это работает вот так: А мне интересно, почему работает не так?
Потому что объект существует до тех пор, пока существует хотя бы одна ссылающаяся на него переменная. а если между ними объявить еще один метод, то ты бы ожидал, что он выполнится сам по себе? Деструктор выполняется в момент уничтожения объекта.
Деструктор срабатывает в момент удаления экземпляра класса, а это или в момент полного выполнения кода или если явно грохнуть объект. Вставь для эксперимента unset($obj);