El ecosistema PHP ha mejorado mucho en los últimos años. Aún así, en el campo de los analizadores estáticos de código, PHP sigue sin destacar demasiado, probablemente debido a su naturaleza dinámica. A pesar de ello, algunas de estas herramientas están empezando a aparecer. En este post vamos a recoger algunas de las herramientas más clásicas y los primeros analizadores estáticos de código para PHP.
PHP Code Sniffer
PHP Code Sniffer es lo que conocemos como un linter, analiza que cumplamos con unas reglas básicas en el código que podemos compartir con el equipo de desarrollo, asegurándonos que todos cumplen con ellas. Un ejemplo es la guerra eterna entre tabuladores y espacios o si todas las sentencias if deben agrupar las sentencias con corchetes. Si definimos un ruleset personalizado, podemos añadirlo al repositorio de código y comprobar que la aplicación cumpla con las reglas definidas. En mi caso, utilizo el estándar PSR-2, ya que con el tiempo debería acabar siendo el estándar mayoritario por ser el oficial. Por último aclarar, que esta herramienta no es un analizador estático de código, es una primera aproximación hacia preocuparse por la calidad del código de nuestras aplicaciones y compartir un estilo de programación con el equipo.
PHP QA Tools
PHP QA Tools es una web que recoge algunas de las herramientas más utilizadas, como PHP Depend, PHP Mess Detector y PhpMetrics. Cada una de ellas resuelve un aspecto muy específico, y en algunos casos puede resultar muy útil, pero en mi opinión hoy por hoy es mejor apoyarse en soluciones de integración continua más fáciles de utilizar y con toda esa información en un único punto moviéndose más hacia una solución de integración continua. Veamos algunas de ellas.
Quality Analyzer
Quality Analyzer es una herramienta open-source muy completa. Aglutina algunas de las herramientas que podemos encontrar en PHP QA Tools.
La instalación es muy sencilla y generar la información también. Para instalar la herramienta solo necesitas git y ejecutar los siguientes comandos.
Y para probar la herramienta sobre una aplicación.
En las siguientes capturas se pueden ver las métricas más importantes en su Dashboard y una imagen de la gráfica de dependencias entre paquetes que muestra.
En el menú superior se puede ver que ofrece otras funcionalidades, como el Mess Detector, que muestra incorrecciones en nuestro código fuente, el checkstyle, que hace la tarea de PHP Code Sniffer y un enlace a “Copy & Paste” donde se detectarán secciones donde se haya duplicado código de manera indiscriminada. Mucho valor para ser una solución gratuita.
Scrutinizer
Scrutinizer es un analizador de pago que aglutina todas las funcionalidades que se espera de un analizador estático para PHP. Es muy completo, pero como he dicho es de pago. Tuvo su momento cuando aún no había soluciones como Quality Analyzer, pero si aún estás a tiempo de elegir qué herramienta utilizar, hoy poy hoy no lo elegiría.
Phan
Phan puede que sea el analizador estático del futuro, pero no es el del presente. Este analizador estático solo funciona con PHP7, que pronto tendrá su lanzamiento estable pero aún no lo es. Lo añado en el post por la curiosidad de que ha sido creado por el creador de PHP Rasmus Lerdorf y porque en un futuro tendremos que tenerlo en cuenta, ya que con tal patrocinio de Rasmus, es probable que desbanque al resto de soluciones, almenos las open-source.
Porqué necesitas un analizador estático de código
Si estás leyendo esto es porque te preocupas por la calidad de tu código. Estas herramientas te pueden ser muy útiles en ese caso, detectan incorrecciones en tu código que te pueden ayudar incluso a mejorar como profesional. El camino es tortuoso y suele hacer falta mucho rigor para aplicar este tipo de herramientas a aplicaciones que no siguen ninguna buena práctica de desarrollo o simplemente se empezaron a desarrollar sin tener estas tecnologías en cuenta porque aún no existían. A pesar de ello, siempre es bueno aplicarlas hasta un cierto nivel así que anímate a probar Quality Analyzer y averigua qué problemas de calidad tiene tu código.