2010-08-08 12 views
14

Questa è la prima volta che pubblicizzo su StackOverflow, ma questi thread mi hanno aiutato moltissimo!Esistono casi in cui NON viene chiamato il distruttore in PHP?

Anywho, sulla mia domanda ... ci sono dei casi in cui NON viene chiamato il distruttore in PHP? Il motivo per cui lo chiedo è che ho una classe mapper che mappa i dati sugli oggetti e nel costruttore, avvio una transazione e nel distruttore chiamerò un commit (avrò anche una funzione membro che può anche eseguire il commit , se necessario). Se ci sono casi in cui il distruttore non viene chiamato, mi piacerebbe saperlo, così posso anticiparlo e pianificare in modo appropriato.

Grazie mille!

risposta

14
  • Secondo il manual, distruttori vengono eseguiti anche se lo script viene terminato utilizzando die() o 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.

  • Secondo this SO question, il distruttore non non sono eseguite quando il tempo di esecuzione di PHP limite raggiunto (Confermato su Apache 2, PHP 5.2 su Windows 7).

  • Il distruttore anche non viene eseguito quando lo script termina perché è stato raggiunto il limite di memoria. (Appena testato)

  • Il distruttore fa vengono eseguiti in caso di errori fatali (appena testato) Aggiornamento: L'OP non può confermarlo - sembra che ci siano errori fatali in cui le cose sono diverse

  • Lo fa non sono eseguite su errori di analisi (perché l'intero script non sarà interpretato)

  • il distruttore non sarà certamente eseguito se si verifica il crash del server di processo o di qualche altra eccezione fuori controllo di PHP.

Tutto sommato, sembra piuttosto affidabile.

Lo svantaggio di fare altre operazioni di pulizia nel distruttore, tuttavia, è che le opzioni disponibili sono piuttosto limitate. Non è possibile generare eccezioni (eccetto se le si cattura di nuovo all'interno del distruttore), non è possibile generare alcun messaggio di errore, non è più possibile fare affidamento sulla presenza di altri oggetti (come l'interfaccia del database). .... Non ho una profonda esperienza nel lavoro con i distruttori, ma non sono sicuro se quello che stai progettando di fare è un'idea fattibile.

+0

Grazie! :) Avevo visto questo frammento dal manuale, ma ho pensato di provare ad essere sicuro chiedendo anche qui. Ho appena provato per vedere cosa è successo quando si è verificato un errore fatale. Tutto ciò che ho fatto è stato creato un membro che tenta di chiamare un membro inesistente. Il distruttore NON è stato chiamato. Ovviamente, viene chiamato con avvertenze e sotto. Altrimenti, non riesco a pensare a nessun'altra istanza che possa essere controllata per vedere se viene chiamata. Suppongo che lo faccia e faccia test approfonditi! Grazie ancora! –

+0

@Logan, prego. La cosa interessante dell'errore fatale: ha funzionato per me quando si provoca uno usando '$$ fake();' Forse dipende dal tipo di errore. Inoltre, controlla il paragrafo che ho appena aggiunto con alcune considerazioni sull'idea generale. –

+0

grazie per le informazioni extra! Ho appena provato per vedere se cosa potevo fare in un distruttore. Finora, so di poter chiamare una funzione membro della stessa classe e una funzione membro di una classe diversa (istanziata dal costruttore). Forse posso fare quello che volevo fare, pubblicherò un altro commento una volta che lo scoprirò di sicuro. –

2

Vorrei solo aggiungere, se si ha un errore fatale all'interno di un distruttore, può impedire l'esecuzione di altri distruttori.

Problemi correlati