So ignorieren Sie bestimmte Coding-Standardfehler in PHP CodeSniffer

14

Wir haben eine PHP 5-Webanwendung und testen derzeit PHP CodeSniffer, um zu entscheiden, ob das Erzwingen von Codestandards die Codequalität verbessert, ohne zu viel Kopfzerbrechen zu verursachen. Wenn es gut erscheint, fügen wir einen SVN-Pre-Commit-Hook hinzu, um sicherzustellen, dass alle neuen Dateien, die in der dev-Verzweigung festgeschrieben wurden, frei von Standardgerüchen sind.

Gibt es eine Möglichkeit, PHP codeSniffer so zu konfigurieren, dass ein bestimmter Fehlertyp ignoriert wird? oder soll es stattdessen einen bestimmten Fehler als Warnung behandeln?

Hier ein Beispiel, um das Problem zu demonstrieren:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div>
    <?php
    echo getTabContent('Programming', 1, $numX, $numY);

    if (isset($msg)) {
        echo $msg;
    }
    ?>
</div>
</body>
</html>

Und das ist die Ausgabe von PHP_CodeSniffer:

> phpcs test.php 

-------------------------------------------------- ------------------------------
GEFUNDEN 2 FEHLER UND 1 WARNHINWEISE, DIE 3 ZEILEN BETROFFEN
-------------------------------------------------- ------------------------------
  1 | WARNUNG | Zeile überschreitet 85 Zeichen; enthält 121 Zeichen
  9 | FEHLER | Fehlender Dateidokumentkommentar
 11 | FEHLER | Zeile falsch eingerückt; Erwartet 0 Leerzeichen, gefunden 4
-------------------------------------------------- ------------------------------

Ich habe ein Problem mit dem Fehler " Zeile falsch eingerückt ". Ich vermute, es passiert, weil ich den PHP-Einzug mit dem HTML-Einzug mische. Aber das macht es lesbarer, nicht wahr? ( In Anbetracht dessen, dass ich momentan nicht die Ressourcen habe, um auf ein MVC-Framework umzusteigen ). Ich würde es also gerne ignorieren.

Tom
quelle
1
Dies ist eine etwas zu große Programmierfrage, um hier zu sein. Da es sich um ein "LINT" -ähnliches Hilfsprogramm handelt, das hauptsächlich für Hardcore-Programmierer interessant ist, nicht unbedingt für Webmaster. Aber es ist schön gefragt und formatiert, so dass wir es für den Moment sein lassen können.
Jeff Atwood
2
Zu der Warnung in Zeile 1: Darf ich die Verwendung von HTML5 DOCTYPE vorschlagen?
Luiscubal
Vielen Dank für Ihr Feedback Jeff - ich freue mich, es zu verschieben. Ich hätte wahrscheinlich feststellen müssen, dass es bei der Erstellung der Frage kein PHP-Tag gab :-).
Tom
@ Luiscubal - er er, guter Vorschlag; wie du denkst ;-)
Tom

Antworten:

11

Ich habe eine Lösung gefunden, um den Fehler " Zeile falsch eingerückt " zu beseitigen, aber zuerst sollte ich das sagen Drachenmantel einen hervorragenden Punkt hat - Sie sollten PHP und HTML nicht mischen. Es ist ein Rezept für Kopfschmerzen. Leider denke ich, dass das Mischen von PHP und HTML besonders in Legacy-Software sehr verbreitet ist.

Die schnellste und schmutzigste Lösung, vorausgesetzt, wir verwenden die phpcsStandard-Codierungsstandards (die PEAR- Standards), besteht darin, die relevante Sniff-Datei zu entfernen. Finden Sie den Speicherort der PEAR-Standards, für mich mit Ubuntu , es war hier:

> cd /usr/share/php/PHP/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace

Benennen Sie die ScopeIndentSniff.phpDatei um, damit der Sniff, der die Codeeinrückung überprüft, nicht mehr ausgeführt wird:

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Arbeit erledigt - jetzt wird der Einzug nicht überprüft und der Fehler " Zeile falsch eingerückt " tritt nicht auf ( und Ihr Code wird nicht dem Standard entsprechen und keine so hohe Qualität aufweisen! ).


Die obige Lösung ist ziemlich amateurhaft - die sauberere Lösung besteht darin, einen neuen Codierungsstandard zu erstellen, der alle PEAR-Standards mit Ausnahme der von Ihnen ausgewählten Anpassungen verwendet. Das geht sehr schnell. So geht's mit getIncludedSniffs()und getExcludedSniffs()und einigen phpcsNamenskonventionen:

Go to the directory where the phpcs coding standards are defined:
> cd /usr/share/php/PHP/CodeSniffer/Standards

Create a new directory for your new standard:
> sudo mkdir PEARish
> cd PEARish

Create your new standard by saving the following in the file:
> sudo emacs PEARishCodingStandard.php
<?php
class PHP_CodeSniffer_Standards_PEARish_PEARishCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard
{
    public function getIncludedSniffs()
    {
      return array('PEAR');
    }

    public function getExcludedSniffs()
    {
      return array('PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php');
    }
}
?>

Testen Sie Ihren neuen benutzerdefinierten Codierungsstandard, indem Sie ihn phpcsmit dem --standardFlag aufrufen . Beispielsweise:

> phpcs --standard=PEARish Test.php

Sobald es funktioniert, können Sie Ihren neuen Standard als Standard festlegen, was bedeutet, dass Sie das --standardFlag nicht jedes Mal eingeben müssen, wenn Sie Folgendes verwenden phpcs:

> sudo phpcs --config-set default_standard PEARish

Weitere Informationen finden Sie im phpcs-Handbuch .

Tom
quelle
Das war sehr praktisch - ich habe diese Antwort verwendet, um Fehler zu entfernen, die in Anlehnung an "Klasse muss sich in einem Namespace von mindestens einer Ebene befinden" und um Fehler bei der Benennung von Kamelfallfunktionen zu beheben. Ich benutze PSR2 so oft ich kann, aber wenn ich eine Magento-Site bearbeite, bin ich nicht in der Lage, alle Funktionen durchzugehen, umzubenennen und den Namensraum zu sortieren.
Dave Child
7

Sie werden auf viele Probleme stoßen, wenn Sie PHPCS mit Ihrem in HTML gemischten PHP-Code ausführen. PHPCS ist nur dann wirklich nützlich, wenn Sie reine PHP-Skripte analysieren. Die integrierten Codierungsstandards basieren auf reinem PHP und nicht auf gemischtem PHP / HTML.

Eine Möglichkeit wäre, einen eigenen benutzerdefinierten Standard zu erstellen und diesen stattdessen zu verwenden. Der benutzerdefinierte Standard würde das Mischen von Code berücksichtigen, aber es wäre wahrscheinlich mühsam, ihn zu schreiben.

Die andere Option ist die Verwendung eines Templating-Systems, da Sie gesagt haben, dass Sie nicht zu einem Framework wechseln möchten. Smarty und Twig können beide außerhalb eines MVC-Frameworks verwendet werden. Wechseln Sie zu einem dieser Ordner, und lassen Sie PHPCS nur die .PHP-Dateien analysieren, nicht die Vorlagendateien.

Drachenmantel
quelle