HervéRenault.fr

Logo de PHP Mess Detector

Ignorer temporairement une règle de phpmd

Normalement, il ne faut pas. Mais, parfois…

Il suffit d'ajouter au-dessus de la ligne ou méthode problématique un commentaire de la forme :

    /** @SuppressWarnings(PHPMD.ExitExpression) */
    public function maMethode()
    {
        faitQuelqueChose();

        wp_redirect('quelque-part');
        // XXX WordPress oblige 🤷 https://developer.wordpress.org/reference/functions/wp_redirect/
        exit;
    }

Sans ce commentaire (au format doc, avec deux astérisques au début) on aurait l'erreur suivante :

exemple.php:11	The method maMethode() contains an exit expression.

Pour trouver l'identifiant de la règle à ignorer, identifiant que phpmd n'affiche pas au format texte, il faut utiliser Vim-ALE qui l'affiche dans la location list de Vim (c'est le plus simple) ou exécuter phpmd avec le paramètre xml ou json :

$ phpmd exemple.php xml cleancode,codesize,design,unusedcode
<?xml version="1.0" encoding="UTF-8" ?>
<pmd version="@project.version@" timestamp="2021-10-19T16:12:21+00:00">
  <file name="exemple.php">
    <violation beginline="11" endline="11" rule="ExitExpression" ruleset="Design Rules" externalInfoUrl="https://phpmd.org/rules/design.html#exitexpression" priority="1">
      The method maMethode() contains an exit expression.
    </violation>
  </file>
</pmd>
$ phpmd exemple.php json cleancode,codesize,design,unusedcode
{
    "version": "@project.version@",
    "package": "phpmd",
    "timestamp": "2021-10-19T16:13:30+00:00",
    "files": [
        {
            "file": "exemple.php",
            "violations": [
                {
                    "beginLine": 11,
                    "endLine": 11,
                    "package": null,
                    "function": null,
                    "class": null,
                    "method": null,
                    "description": "The method maMethode() contains an exit expression.",
                    "rule": "ExitExpression",
                    "ruleSet": "Design Rules",
                    "externalInfoUrl": "https:\/\/phpmd.org\/rules\/design.html#exitexpression",
                    "priority": 1
                }
            ]
        }
    ]
}

Note : un autre exemple de règle à ignorer temporairement parfois

C'est StaticAccess. Par exemple sur $connection = DriverManager::getConnection($params, $config); PHPMD va dire
StaticAccess Avoid using static access to class '\Doctrine\DBAL\DriverManager' mais on n'a pas le choix, il faut bien appeler cette méthode statique. En fait, de l'aveu même du mainteneur de PHPMD :

Most of the rules are very strict and analyze the code in a very simplistic way, thus producing potentially many false positives. This is not totally unwanted, as you rather want to see too much, instead of risking seeing too few.

When you have (potential) false positives, you have a look at them and then decide in each case, whether this is a candidate for refactoring or if you have an actual false positive