Порядок работы деструктора, совместно с try catch

252
11 мая 2017, 14:05

Почему, в этом коде

 <?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
Конец программы
Answer 1

У вас метод __destruct() объявлен после метода __construct(), но это не значит, что они будут срабатывать по очереди.

Обычные методы срабатывают тогда, когда их вызывают, а вызывать их можно в любом порядке и сколько угодно раз. В вашем случае __destruct() и __construct() вызываются не явно __construct() - при создании объекта, __destruct() вызывается при уничтожении объекта.

READ ALSO
Проблемы с плагином RedBean

Проблемы с плагином RedBean

Когда пытаюсь создать новую таблицу в базе данных с помощью плагина RedBean выдает вот такую ошибку:

418
Смещение начиная с id

Смещение начиная с id

Есть новостная лента, как получать следующую порцию новостей (10шт) начиная с последней? Дело в том что выдача формируется не по хронологическому...

255
Помогите сформировать SQL запрос

Помогите сформировать SQL запрос

Добрый деньУ меня на сайте нужно вывести товары, но проблема в том, что вся информация разбросана по разным таблицам БД

290
Gzcompress записывает в БД кракозябры

Gzcompress записывает в БД кракозябры

Есть поле в БД с типом text и сравнением utf8_general_ciВ данном поле планирую хранить массив, делаю следующим образом:

287