La mayoría de los recursos en PHP nunca tocan la gestión de memoria porque el lenguaje en sí es bastante bueno para hacer esto por usted. Sin embargo, en PHP a menudo terminas ocupándote de recursos externos que no son memoria: identificadores de bases de datos, sesiones, transacciones de bases de datos, etc. Estos recursos externos podrían manejarse más limpiamente utilizando algún tipo de objeto RAII.¿Admite PHP el patrón RAII? ¿Cómo?
Inicialmente pensé que PHP utilizaba un esquema de recolección de basura similar a la JVM o al CLR, donde el concepto de destructor no existe. (Recuerde: Everyone thinks about garbage collection the wrong way - ¡los finalizadores no son destructores!) Existe el método especial __destruct
, pero pensé que era un "finalizador" similar a un finalizador de Java o C#. Por esta razón, no puede usar RAII en la JVM o en la CLR (los bloques using
de C# le dan aproximadamente el 95% del camino hasta allí, pero eso es un poco diferente ...).
Sin embargo, Google seems to indicate that PHP supports the RAII pattern, aunque no puedo encontrar la verificación de esto en los documentos PHP. ¿El lenguaje lo admite y está poniendo la lógica de limpieza en __destruct
suficiente para realizar tareas de RAII?
Otra advertencia: cuando hay varios objetos dejan alcance, al mismo tiempo, el orden de sus destructores son llamados oficialmente es indefinido, y por lo general en orden FIFO (exactamente el lo contrario de lo que se necesita para un RAII adecuado). Eso es un obstáculo para mi caso de uso particular. – Brilliand
@Brilliand, ¿podrías agregar llaves artificialmente para forzar el orden? :) – hobbs
Las llaves no lo harán; solo una función puede introducir un nuevo alcance. Todavía es posible, supongo, pero eso podría equivaler a una gran repetición. – Brilliand