Ejecución diferida en PHP usando finally

Ejecución diferida en PHP usando finally

La ejecución diferida es una técnica que permite simplificar una función con múltiples flujos o ramificaciones. Ejecutar un cierto bloque al final de todos ellos puede ser complicado, especialmente cuando tenemos múltiples return. En estos casos acabamos repitiendo dicho bloque lo que ensucia el código haciendo mucho más difícil entenderlo y acaba produciendo errores.

En que consiste la ejecución diferida

La ejecución diferida consiste en declarar un bloque de código para su ejecución al final de la función independientemente de cuando se produzca el return. Ciertos lenguajes como Go disponen de una sentencia defer que maneja una lista que se ejecuta al finalizar la función en la que se declaran.

Este tipo de programación se puede usar para multitud de situaciones pero una de las más típicas es el cierre de manejadores de ficheros. Por desgracia, PHP no dispone de este tipo de sentencias. Sin embargo, podemos utilizar un técnica sencilla para conseguir un efecto muy similar.

Usando finally para ejecutar código de forma diferida

Supongamos que tenemos un código que lee un fichero y ejecuta ciertas acciones sobre la primera linea:

Cuando no se pueda leer la primera linea, se cierra el fichero y se devuelve false. Si puede leer la línea, ejecuta ciertos procesos, cierra el fichero y devuelve el resultado. En este caso cerrar el fichero sería nuestro bloque a ejecutar de forma diferida. Ciertamente no parece algo muy grave repetir dicho bloque pero conforme el código se complicase y tuviésemos más puntos de salida podríamos tener problemas.

Para corregir este problema recurrimos al uso de un bloque try-catch-finally. En este caso no tenemos ninguna excepción que capturar, aunque podríamos tenerla en el futuro sin problema, por lo que no es necesario usar catch. El código dentro de la zona finally se ejecutará incluso aunque en bloque try contenga un return.

Conclusión

Esta técnica es sencilla y permite mantener nuestro código limpio y entendible. Especialmente útil para tareas de limpieza, logging o como en el caso del ejemplo, para cerrar flujos de e/s.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *