psalm

Utiliza Psalm para realizar análisis de código estático PHP

Existen varias alternativas para realizar análisis de código estático, pero en esta entrada te voy a enseñar a cómo instalar y utilizar Psalm para analizar tu código PHP.

Pero antes de ello, ¿qué es el análisis de código estático? Podemos decir que es analizar/escanear el código en busca de errores, variables no definidas, code smells, vulnerabilidades, etc… incluso también cumplir con unos estándares de codificación.

Este análisis se realiza directamente sobre el código fuente sin necesidad de ejecutarlo, lo que nos permitiría hacerlo en un proceso de CI/CD y echar para atrás un nuevo desarrollo si este no pasa los tests.

Es un imprescindible sobre todo si trabajas en equipo, ya que con el tiempo se va adquiriendo una estandarización a la hora de codificar entre todos los miembros, y se evitan errores conocidos, se aumenta la calidad del código, etc…

Instalación y primeros pasos

En la documentación oficial puedes encontrar información detallada, pero la instalación se resume en dos premisas: necesitas (a día de hoy) PHP 7.4 o superior y composer. Teniendo esto, simplemente ve a la raíz de tu tema, plugin o desarrollo personalizado y ejecuta desde la terminal:

composer require --dev vimeo/psalm

El siguiente paso es crear una configuración, para ello vamos a generar el fichero de configuración con este comando:

./vendor/bin/psalm --init

Esto además de generar el fichero de configuración, calculará el mejor nivel de configuración realizando un primer escaneo. Psalm dispone de varios niveles (de 1 a 8. 1 más estricto, 8 más laxo) para ser más o menos estricto en el análisis de código. Este primer valor que te calcula lo puedes modificar manualmente en el archivo psalm.xml que se ha generado en la raíz de tu proyecto.

Para realizar el primer análisis y ver los errores que detecta psalm, simplemente tienes que ejecutar:

./vendor/bin/psalm

Te aparecerán en pantalla un listado con todos los errores que ha encontrado en tu proyecto: unusedClass, PossiblyUnusedParam, InvalidReturnType, UndefinedVariable, UnevaluatedCode, PossiblyUnusedMethod, etc… por eso comentaba antes que con el tiempo, una vez tienes una herramienta que te avisa de estos errores, se va adquiriendo e interiorizando una manera de trabajar, y si trabajas en equipo esto se hace imprescindible para reducir fricciones cognitivas, estandarizar la manera de trabajar, etc…

Configuración recomendada

Como comentaba antes, puedes configurar el nivel del análisis de código (más o menos estricto). En general, podrías empezar con un nivel 4 y cuando tengas más confianza probar con el 3. Con estos niveles «en verde» estarás teniendo una base sólida.

No obstante, puede que en algún caso te esté dando un falso positivo (por ejemplo, una clase que aún no la utilizas pero la utilizarás), o que quieras suprimir en análisis en alguna carpeta concreta (por: tests, vendor…). Puedes conseguir esto a través del archivo psalm.xml:

<?xml version="1.0"?>
<psalm
    errorLevel="3"
    phpVersion="8.1"
    resolveFromConfigFile="true"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="https://getpsalm.org/schema/config"
    xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
    findUnusedBaselineEntry="true"
    findUnusedCode="true"
>
    <projectFiles>
        <directory name="src" />
        <ignoreFiles>
            <directory name="vendor" />
        </ignoreFiles>
    </projectFiles>

    <issueHandlers>
        <PossiblyUnusedMethod>
            <errorLevel type="suppress">
                <directory name="src" />
            </errorLevel>
        </PossiblyUnusedMethod>
    </issueHandlers>
</psalm>

Tienes todas las posibles configuraciones en la documentación oficial: https://psalm.dev/docs/running_psalm/configuration/

Cómo lidiar con los errores

En el listado de errores que te aparece en la terminal, tendrás una breve descripción del error, el archivo en el que se encuentra, y el número de línea concreto donde se encuentra ese error. Además, entre paréntesis, tendrás un enlace donde te lleva a la documentación oficial, y donde se explica el qué y el porqué está dando ese error.

Un error muy común es PossiblyUndefinedVariable. Si haces click en el enlace te lleva a la documentación donde te lo explica con un ejemplo:

<?php

function foo() : void {
    if (rand(0, 1)) {
        $a = 5;
    }
    echo $a;
}

En este ejemplo tenemos una variable $a que sólo se inicializa si se cumple esta condición, de tal modo que si no se cumple estaremos haciendo un «echo» de una variable que no está definida, lo que devolverá un warning.

Aunque es un ejemplo sencillo, simplemente nos da una idea para entender las ventajas que nos puede dar el uso de un analizador de código estático. Además de aumentar la calidad del código y reducir el riesgo de errores, con el tiempo es algo que se irá interiorizando en la manera de trabajar del equipo.

El listado completo de Issues que psalm analiza lo tienes en la documentación oficial: https://psalm.dev/docs/running_psalm/issues/.

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

Deja un comentario

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

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios