Почему, в этом коде
<?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>';
объект не сразу уничтожается? Ведь после конструктора, сразу указан деструктор.
Сейчас это работает вот так:
Начало программы
Начало try-блока
Создан объект outer
Создан объект inner
Внимание, вбрасывание!
Уничтожен объект inner
Уничтожен объект outer
Исключение: Hello
Конец программы
А мне интересно, почему работает не так?
Начало программы
Начало try-блока
Создан объект outer
Уничтожен объект outer
Создан объект inner
Уничтожен объект inner
Внимание, вбрасывание!
Исключение: Hello
Конец программы
У вас метод __destruct() объявлен после метода __construct(), но это не значит, что они будут срабатывать по очереди.
Обычные методы срабатывают тогда, когда их вызывают, а вызывать их можно в любом порядке и сколько угодно раз. В вашем случае __destruct() и __construct() вызываются не явно __construct() - при создании объекта, __destruct() вызывается при уничтожении объекта.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей