2010-08-08 11 views
14

To jest mój pierwszy wpis do stackoverflow, ale te wątki bardzo mi pomogły!Czy są jakieś przypadki, gdy destruktor w PHP NIE jest wywoływany?

Anywho, na moje pytanie ... czy są jakieś przypadki, gdy destruktor w PHP NIE jest wywoływany? Powodem, dla którego pytam, jest to, że mam klasę mapperów, która mapuje dane do obiektów iw konstruktorze, zaczynam transakcję, a w destruktorze wezwę commit (będę również miał funkcję członka, która może również wykonać zlecenie , Jeśli to konieczne). Jeśli istnieją przypadki, gdy destruktor nie jest wywoływany, chciałbym wiedzieć, więc mogę przewidzieć, że to się dzieje i odpowiednio zaplanować.

Dziękuję bardzo!

Odpowiedz

14
  • Według manual, destruktory są wykonywane nawet jeśli skrypt zostanie zakończony za pomocą die() lub exit():

    The destructor will be called even if script execution is stopped using exit(). Calling exit() in a destructor will prevent the remaining shutdown routines from executing.

  • Według this SO question, destruktor robi nie zostanie wykonany po czasie wykonanie PHP limit został osiągnięty (Potwierdzone na Apache 2, PHP 5.2 na Windows 7).

  • Destruktor wykonuje również nie, gdy skrypt zostaje zakończony, ponieważ został osiągnięty limit pamięci. (Tylko sprawdzone)

  • Destruktor robi zostanie wykonany na błędy krytyczne (tylko sprawdzone) Aktualizacja: PO nie może to potwierdzić - nie wydają się być błędy krytyczne, gdzie rzeczy są różne

  • Czyni nie zostanie wykonany na błędy parse (bo cały skrypt nie będą interpretowane)

  • destruktor na pewno nie będzie stracony, jeśli wystąpi awarii Process server lub jakiś inny wyjątek z kontrolą PHP.

Podsumowując, wygląda całkiem niezawodnie.

Wadą wykonywania innych czynności niż czyszczenie w destruktorze jest to, że opcje są tam nieco ograniczone. Nie można już wyrzucać wyjątków (z wyjątkiem sytuacji, w których ponownie przechwycimy je w destruktorze), nie można wysyłać żadnych komunikatów o błędach, nie można już polegać na obecności innych obiektów (takich jak interfejs bazy danych). .... Nie mam głębokiego doświadczenia w pracy z destruktorami, ale nie jestem pewien, czy to, co planujesz zrobić, jest wykonalnym pomysłem.

+0

Dziękujemy! :) Widziałem ten fragment z podręcznika, ale pomyślałem, że postaram się też być bezpieczny, prosząc również o to. Właśnie przetestowałem, aby zobaczyć, co się stało, gdy wystąpił błąd krytyczny. Wszystko, co zrobiłem, to utworzony członek, który próbuje wywołać nieistniejącego członka. Destruktor NIE został wywołany. To oczywiście wywołuje się z ostrzeżeniami i poniżej. W przeciwnym razie nie mogę wymyślić żadnych innych instancji, które można sprawdzić, aby sprawdzić, czy zostaną wywołane. Po prostu przyjmuję, że to robi i przeprowadza szeroko zakrojone testy! Jeszcze raz dziękuję! –

+0

@Logan nie ma za co. Interesujące w tym fatalnym błędzie: zadziałało to dla mnie, prowokując jednego przy użyciu '$$ fake();} Może to zależy od rodzaju błędu. Sprawdź także akapit, który właśnie dodałem, z pewnymi przemyśleniami na temat ogólnej idei. –

+0

dzięki za dodatkowe informacje! Właśnie przetestowałem, aby zobaczyć, co mogę zrobić w destruktorze. Do tej pory wiem, że mogę wywołać funkcję składową tej samej klasy i funkcję składową innej klasy (utworzoną z konstruktora). Może mogę zrobić to, co chcę zrobić, dodam kolejny komentarz, gdy się dowiem. –

2

Chciałbym tylko dodać, jeśli w destruktorze wystąpił błąd krytyczny, może on zatrzymać wykonywanie innych destruktorów.

Powiązane problemy