2010-08-08 6 views
14

¡Esta es la primera vez que publico en stackoverflow, pero estos hilos me han ayudado tremendamente!¿Hay alguna instancia en la que NO se invoque el destructor en PHP?

Anywho, en mi pregunta ... ¿hay algún caso cuando NO se llama al destructor en PHP? La razón por la que pregunto es porque tengo una clase mapper que mapea datos en objetos y en el constructor, inicio una transacción y en el destructor llamaré a un commit (también tendré una función miembro que también puede hacer el committal , si necesario). Si hay algún caso en el que no se llame al destructor, me gustaría saberlo para anticiparlo y planificarlo adecuadamente.

Muchas gracias!

Respuesta

14
  • De acuerdo con la manual, destructores son ejecutados incluso si el guión se termina usando 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.

  • Según this SO question, el destructor hace no se ejecutan cuando el tiempo de ejecución de PHP se alcanza el límite (confirmado en Apache 2, PHP 5.2 en Windows 7).

  • El destructor también no no se ejecuta cuando el script finaliza porque se alcanzó el límite de memoria. (Sólo probado)

  • El destructor hace se ejecutan en los errores fatales (Sólo probado) Actualización: El PO no puede confirmar esto - parece que hay errores fatales donde las cosas son diferentes

  • Lo hace no se ejecutan en errores de análisis (porque no se puede interpretar todo el guión)

  • el destructor sin duda no será ejecutado si se produce se bloquea el proceso del servidor o alguna otra excepción fuera del control de PHP.

En general, parece bastante confiable.

La desventaja de hacer otras cosas además de la limpieza en el destructor, es que sus opciones allí son algo limitadas. Ya no puedes lanzar excepciones (excepto si las capturas nuevamente dentro del destructor), no puedes enviar ningún mensaje de error, ya no puedes confiar en la presencia de otros objetos (como la interfaz de la base de datos). .... No tengo una experiencia profunda en el trabajo con destructores, pero no estoy seguro de si lo que planeas hacer es una idea factible.

+0

¡Gracias! :) Había visto ese fragmento del manual pero pensé que lo intentaría y estaría seguro al preguntar aquí también. Acabo de probar para ver qué sucedió cuando se produjo un error fatal. Todo lo que hice fue crear un miembro que intenta llamar a un miembro inexistente. El destructor NO fue llamado. Sí, por supuesto, recibe una llamada con advertencias y más abajo. De lo contrario, no puedo pensar en ninguna otra instancia que se pueda verificar para ver si se llama. ¡Asumo que sí y hago pruebas exhaustivas! ¡Gracias de nuevo! –

+0

@Logan de nada. Algo interesante sobre el error fatal: funcionó para mí al provocar uno usando '$$ fake();' Tal vez depende del tipo de error. Además, consulte el párrafo que acabo de agregar con algunas reflexiones sobre la idea general. –

+0

gracias por la información extra! Acabo de probar para ver si puedo hacer algo en un destructor. Hasta ahora, sé que puedo llamar a una función miembro de la misma clase y a una función miembro de una clase diferente (instanciada del constructor). Tal vez pueda hacer lo que quería hacer, publicaré otro comentario una vez que me entere. –

2

Me gustaría agregar que, si tiene un error fatal dentro de un destructor, puede detener la ejecución de otros destructores.

Cuestiones relacionadas