За последние 24 часа нас посетили 39690 программистов и 2343 робота. Сейчас ищут 1166 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 9 май 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Почему, в этом коде

    PHP:
    1. <?php
    2. class Orator {
    3.     private $name;
    4.     function __construct($name){
    5.         $this->name = $name;
    6.         echo 'Создан объект ' . $this->name . '<br>';
    7.     }
    8.    
    9.     function __destruct() {
    10.         echo 'Уничтожен объект ' . $this->name . '<br>';
    11.     }
    12. }
    13. function outer(){
    14.     $obj = new Orator(__METHOD__);
    15.     inner();
    16. }
    17. function inner(){
    18.     $obj = new Orator(__METHOD__);
    19.     echo 'Внимание, вбрасывание!<br>';
    20.     throw new Exception('Hello');
    21. }
    22.  
    23. echo 'Начало программы<br>';
    24.  
    25. try {
    26.     echo 'Начало try-блока<br>';
    27.     outer();
    28.     echo 'Конец try-блока<br>';
    29. }
    30. catch (Exception $e) {
    31.     echo 'Исключение: ' . $e->getMessage() . '<br>';
    32. }
    33. echo 'Конец программы<br>';
    объект не сразу уничтожается?
    Ведь после конструктора, сразу указан деструктор.

    Сейчас это работает вот так:

    А мне интересно, почему работает не так?

     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Потому что объект существует до тех пор, пока существует хотя бы одна ссылающаяся на него переменная.
    а если между ними объявить еще один метод, то ты бы ожидал, что он выполнится сам по себе? Деструктор выполняется в момент уничтожения объекта.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Деструкторы в php вообще достаточно странные, я ими не пользуюсь поэтому
     
  4. Vermorr

    Vermorr Новичок

    С нами с:
    9 май 2017
    Сообщения:
    1
    Симпатии:
    0
    Деструктор срабатывает в момент удаления экземпляра класса, а это или в момент полного выполнения кода или если явно грохнуть объект.
    Вставь для эксперимента unset($obj);