За последние 24 часа нас посетили 19132 программиста и 1638 роботов. Сейчас ищут 920 программистов ...

Перенос вызова деструктора

Тема в разделе "Прочие вопросы по PHP", создана пользователем Mr.M.I.T., 15 июн 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Такая бЯда.
    Можно ли как-нибудь сделать чтобы деструкторы отрабатывали строго в конце приложения
    точнее меня не устраивает
    PHP:
    1. <?
    2. class A{
    3.  function mz(){
    4.     $b=new b();
    5.     /* ... */
    6.     // $b destruct
    7.     return;
    8.  }
    9. }
    10. ?>
    впринципе я решил это при помоши загрузки класса через фабрику, но но но
    есть ли стандартные методы?
     
  2. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А чем не устраивает принудительный вызов в конце скрипта?

    PHP:
    1. <?
    2.  
    3. // Script ..
    4.  
    5. // Finishing
    6. $foo->__destruct();
    7. $bar->__destruct();
    8. // или
    9. $foobar->free($ob); // Метод free содержит вызов деструктора
    10.  
    11. ?>
     
  3. kostyl

    kostyl Guest

    Сохранять хотя бы одну ссылку на объект до конца приложения.
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Дак как раз при принудительном вызове мы храним ссылку на объект для того, чтобы иметь возможность его вызвать.
    Тем более он будет вызван гарантированно, но в случае, если у нас дохрена этих ссылок, да ещё вложенных в сам объект, то .. то гарантировать, что деструктор будет вызван программно нельзя.
     
  5. kostyl

    kostyl Guest

    Это стандартный метод
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Apple
    2 раза нельзя его вызывать
    kostyl
    фабрика как раз и хранит, а без фабрики?
     
  7. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А зачем его два раза вызывать? :)
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Apple
    он сам будет 2 раза вызываться
    я про
    PHP:
    1. А чем не устраивает принудительный вызов в конце скрипта?
    а если фабрика, деструктор вызовет сборщик мусора
     
  9. kostyl

    kostyl Guest

    Mr.M.I.T.
    Нужно хранить ссылку до конца скрипта. Без разницы где ты будешь ее хранить - в фабрике(тобишь локальной, живущей до конца области) или в глобальной области, если она дотянет то вызовется в конце. Можно как то конечно попробывать с функциями, которые выполняются после работы скрипта(не помню как там они декларируются), но все равно ссылку нужно сохранить будет. Больше никак.
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    я знаю что нужно хранить ссылку до конца
    хорошо перефразирую как сделать чтобы все ссылки автоматически хранились до конца
     
  11. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    а нельзя у самого-самого прародителя открыть конструкт и прописать там один раз так?

    PHP:
    1. <?php
    2. __construct(){
    3.     self::$refs[]= $this;
    4. }
    5.  
     
  12. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    может есть какие-то команды, которые программно отключают сборщик мусора? тогда и ссылки хранить не надо.
     
  13. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Мне кажется, что если приложение так начинает зависеть от кода, то стоит потратить день-два, чтобы перепроектировать это место.
     
  14. Frozen

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2.  <?php
    3.  class A{
    4.   function mz(){
    5.      if (!this->b) {
    6.          $this->b =new b();
    7.      }
    8.       $this->b->doSmth();
    9.      /* ... */
    10.      return;
    11.   }
    12.  }
    13.  ?>
     
  15. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Лучше наверное $this->getB()->doSmth();
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    да уже так и сделал только через __get __set
    iliavlad
    нет не стоит, там всего-то для пары классов такое надо
     
  17. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    А можешь рассказать, что за задача такая и что за классы? А то вдруг будет похожая проблема)
     
  18. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    PHP:
    1. <?
    2. class A {
    3.    function Add() {}
    4.    function Save(){}
    5.    function __destruct(){
    6.        $this->Save();
    7.    }
    8. }
    9. ?>
    Проблема в том что мне лень каждый раз вручную вызывать Save =)
     
  19. kostyl

    kostyl Guest

    Mr.M.I.T.
    А тебе не надо обрабатывать результат Save()?
     
  20. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    unit of work, не?
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    kostyl
    она нечё не возвращает
    Sergey89
    хз, а чё это? :)
     
  22. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  23. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Sergey89
    А это не тоже самое?
    $A=LF::LoadClass("A");
     
  24. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    или он Save должен дёргать?