За последние 24 часа нас посетили 34974 программиста и 1756 роботов. Сейчас ищут 833 программиста ...

Деструктор

Тема в разделе "Прочие вопросы по PHP", создана пользователем _AVS_, 4 ноя 2007.

  1. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Здравствуйте! У меня возникла следующая проблема. В один из классов я вписал деструктор, который выполняет отсоединение от базы данных. На моей локальной машине (PHP 5.2.1) он выполняется как положено, после выполнения всех сценариев во время удаления всех объектов. На удаленном сервере (PHP 5.2.3) деструктор исполняется во время выполнения сценариев, т.е. перед тем когда начинается построение страницы. У меня несколько классов наследуются друг у друга. В последнем классе как раз и установлен деструктор. В чем может быть причина?
     
  2. Anonymous

    Anonymous Guest

  3. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Причина похожая, но мне не понятно как можно избежать этой проблемы.

    Вот мой код:

    PHP:
    1.  
    2. <?php
    3. class test
    4. {
    5.     function __construct()
    6.     {
    7.         echo 'Конструктор<br>';
    8.     }
    9.    
    10.     function test()
    11.     {
    12.         echo 'Hello, World!<br>';
    13.     }
    14.    
    15.     function __destruct()
    16.     {
    17.         echo 'Деструктор';
    18.     }
    19. }
    20.  
    21. $object=new test;
    22.  
    23. $object->test();
    24. ?>
    25.  
    PHP 5.2.1:
    Конструктор
    Hello, World!
    Деструктор

    PHP 5.2.3:
    Конструктор
    ДеструкторHello, World!
    Деструктор

    Как можно изменить этот код так, чтобы все работало нормально как в первом результате? В ООП я только начинаю работать. Объясните это все подробнее. Спасибо.
     
  4. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    _AVS_
    Если на PHP 5.2.3 этот фрагмент кода действительно отрабатывает так как ты написал, то это явный баг PHP. Пиши на bugs.php.net (хотя не советую, смысла нет, все равно ответят что "так и надо" ;)).
     
  5. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Да, отрабатывает именно так. Я очень удивился когда залил на хостинг, работающий с поддержкой PHP 5.2.3.
     
  6. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    _AVS_
    У меня нет установленной версии 5.2.3, чтобы проверить. Но если ты прав - это конечно скандал, немало скриптов помимо твоего начнут валиться с ошибками. Попробуй уговорить хостера либо откатиться до 5.2.1, либо подняться до 5.2.4, хотя в списке изменений для этой версии я не нашел ничего, связанного с деструкторами.
     
  7. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Извините, ошибся. Отрабатывает нормально на 5.2.4. Баг Деструктора в 5.2.3.
     
  8. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    1. Попросил друга проверить на 5.2.3 - у него все нормально.
    2. У тебя название функции test совпадает с именем класса. Видимо, PHP принимает ее за некий "альтернативный конструктор". Два конструктора - два деструктора... хотя это все равно было бы ошибкой.
     
  9. _AVS_

    _AVS_ Активный пользователь

    С нами с:
    20 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3. class test
    4. {
    5.     function __construct()
    6.     {
    7.         echo 'Конструктор<br>';
    8.     }
    9.    
    10.     function tester()
    11.     {
    12.         echo 'Hello, World!<br>';
    13.     }
    14.    
    15.     function __destruct()
    16.     {
    17.         echo 'Деструктор';
    18.     }
    19. }
    20.  
    21. $object=new test;
    22.  
    23. $object->tester();
    24. ?>
    25.  
    Только что проверил на удаленной машине. Исполнилось так же! Я еще раз проверил - у них точно стоит 5.2.3!

    Я вчера обновлял сайт. Деструктор отсоединялся от базы не успев построить страницу. Я не мог понять в чем проблема. Я в шоке. Я написал в техподдержку хостинга.
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Может баг какого-нибудь оптимайзера, например Zend Optimizer?