• PHP Code Sniffer – Parameter und eigene Regelsets (Standard)

    von am 11. März 2009

    Gestern hatten wir über die Installation und die erste Verwendung des PHP Code Sniffers (PCS) geredet. Heute werde ich noch ein wenig über die Parameter reden, die ich gestern noch nicht angesprochen habe, die aber trotzdem wichtig sind. Im zweiten Teil geht es dann um Regelsets. Wir werden lernen, wie man vorhandene Regeln zu seinem eigenen Set kombiniert.

    PHP Code Sniffer Parameter

    Zwei wichtige Parameter hatten wir ja gestern bereits erklärt, v für verbose und --standard für die Wahl der Standards. Hier aber die Liste der weiteren Parameter.

    • --extensions
      Mit diesem Parameter definieren wir, welche Endungen wir durch den Sniffer jagen wollen. Da wir PCS auch auf komplette Verzeichnisse loslassen können kann dies ganz nützlich sein. Interessant ist vielleicht auch zu wissen, dass der Sniffer auf JavaScript Dateien untersuchen kann. Leider hat dieses Feature bei unsere Projekten immer zu Problemen geführt und aus diesem Grund haben wir hier auch nur .php Dateien erlaubt, denn in der Standard Einstellung werden auch .js Dateien kontrolliert. Natürlich sollte es auch einen Zeitgewinn bringen, falls man nur PHP Regeln definiert hat und er die .js Datein trotzdem syntaktisch auseinander nimmt.
      Beispiel: --extension php,js
    • --report
      Wenn wir das Tool über die Kommandozeile händisch aufrufen, dann sollte uns dieser Parameter nicht so wichtig vorkommen. In der Kombination mit PhpUnderControl ist er jedoch sehr hilfreich. Vielleicht noch so am Rande: wählt man als report Typ “checkstyle”, so werden Logfiles produziert, die identisch mit denen sind, die vom Java Tool Checkstyle produziert werden. Wie ich finde ziemlich praktisch, da ich so alle Auswertetools für Checkstyle auch auf meine PHP Ergenisse anwenden kann.
      Beispiel: --report checkstyle
    • --ignore
      Natürlich will man nicht immer alle Dateien, die in einem bestimmten Verzeichnis sind überprüfen. Third Party Code sollte in den meisten Fällen nicht mitgetestet werden. Aus diesem Grund gibt es den ignore Parameter, mit dem man definieren kann, was ignoriert werden soll. Der Parameter nimmt als Werte Komma separierte “Patterns” an.
      Beispiel: --ignore lib/*,*/tests/*, diese Einstellung würde das Verzeichnis lib komplett außen vor lassen, genau so wie alle tests Unterverzeichnisse, egal wo diese sich befinden.

    Ich denke fürs erste sollten diese Parameter reichen, um den Einstieg in PCS zu schaffen. Wer weitere Beispiel nützlich findet, der sollte sich die Projektseite noch einmal genauer ansehen.

    Regelsets zusammenstellen

    Nachdem wir nun wissen, wie wir bereits existierende Standards einbinden und sie über die Kommandozeile auch aufrufen können, wollen wir jetzt unsere eigenen Sets zusammenstellen. Da dies am einfachsten an einem Beispiel zu erläutern ist, nutzen wir doch das Zend Regelset um es mal genauer zu betrachten. Dieses sollte sich in folgendem Verzeichnis befinden:

    /usr/share/php/PHP/CodeSniffer/Standards/Zend/ZendCodingStandard.php

    Der Inhalt, zumindest unter der Code Sniffer Version 1.2.0a1 sollte wie folgt aussehen:

    class PHP_CodeSniffer_Standards_Zend_ZendCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard
    {
        public function getIncludedSniffs()
        {
            return array(
                    'Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php',
                    'Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php',
                    'Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php',
                    'PEAR/Sniffs/Classes/ClassDeclarationSniff.php',
                    'PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php',
                    'PEAR/Sniffs/Files/LineEndingsSniff.php',
                    'PEAR/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php',
                    'PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php',
                    'PEAR/Sniffs/Functions/ValidDefaultValueSniff.php',
                    'PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php',
                    'Squiz/Sniffs/Functions/GlobalFunctionSniff.php',
                   );
        }
    }

    Ich war mal so frei und habe den ganzen Kommentar Teil weggelassen. Wenn ihr aber die ganze Datei sehen wollt, dann habe ich sie für euch hier hoch geladen. Betrachtet man die Klasse, so ist das einzige, was sie macht einen Array zurück zu liefern, der alle Regeln, sogenannte Sniffs, beinhaltet. Die Pfade sind hierbei relativ zum Standards Verzeichnis zu sehen.

    Damit wir unseren eigenen Standard definieren können erstellen wir erst mal im Standards Verzeichnis unser Unterverzeichnis PhpHatesMe und kopieren dort den Zend Standard als PhpHatesMeCodingStandard.php rein. Jetzt passen wir noch Klassennamen (PHP_CodeSniffer_Standards_PhpHatesMe_PhpHatesMeCodingStandard) an und fertig ist unser eigenes Set. Wie immer habe ich es auch schon vorbereitet. Prinzipiell können wir unseren Standard jetzt auch schon verwenden.

    phpcs --standard=PhpHatesMe badClass.php

    Der Output ist wie erwartet:

    FILE: /var/www/phpcodesniffer/badClass.php
    --------------------------------------------------------------------------------
    FOUND 4 ERROR(S) AND 0 WARNING(S) AFFECTING 4 LINE(S)
    --------------------------------------------------------------------------------
      5 | ERROR | Spaces must be used to indent lines; tabs are not allowed
      7 | ERROR | Spaces must be used to indent lines; tabs are not allowed
      8 | ERROR | Spaces must be used to indent lines; tabs are not allowed
     10 | ERROR | Spaces must be used to indent lines; tabs are not allowed
    --------------------------------------------------------------------------------

    Jetzt liegt es an euch. Es gibt ca. 160 vordefinierte Regeln, die ich ausprobieren könnt. Für die, die nicht so firm sind mit Linux, hier der Befehl, wie ihr euch alle auflisten lassen könnt: find -iname '*Sniff.php'. In den meisten Fällen sind die Namen ja schon relativ selbstredend. Wer aber genau wissen will, was ein Sniff so alles treibt, der kann sich die gute PHPDoc Dokumentation anschauen, die in jedem File vorhanden ist. Die Zusammenfassung dazu findet ihr aber auch auf der PEAR Doku Seite.

    Falls jemand eine gute Seite kennt, auf der näher auf die einzelnen Regeln eingegangen wird, dann kann er mir diese gerne nennen. Ich werde sie dann nennen.

    Morgen kommt der komplexeste Teil der Reihe: eigene Regeln schreiben. Da dies der Teil ist, den ich selbst noch nie gemacht habe, wird es ein sehr spannendes Kapitel … auch und besonders für mich.

    Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    9 Kommentare »


    • Dennis Becker
      am 11. März 2009 um 08:33 Uhr

      Gute Beschreibung – ich denke mal heute werden schon einige anfangen, eigene Rule-Sets zu erstellen (oder zumindest mal ausprobieren). Mir persönlich reichen zum Glück die Rules vom Zend Framework, so dass ich da nicht experimentieren muss.


    • PHP hates me - Der PHP Blog » Statische Code-Analyse mit dem PHP Code Sniffer
      am 11. März 2009 um 17:05 Uhr

      [...] Regelsets zusammenstellen [...]


    • jascha
      am 11. März 2009 um 19:54 Uhr

      Hallo,

      sehr interessant die Geschichte mit dem Sniffer. Was mich interessieren würde wie man mit PHP (Browser statt Konsole) Verzeichnisse mit PHP-Dateien überprüfen kann.

      Grüsse Jascha


    • Roman
      am 14. April 2009 um 13:01 Uhr

      Gute Tipps, danke dafür. :-)
      Habe mit Spannung auch die anderen Teile zu PHPCS gelesen, aber nun lasse ich auch mal ein Dankeschön hier.


    • Codemetriken in PHP « What was it again?
      am 19. Mai 2009 um 09:09 Uhr

      [...] Vorgefertigte Coding-Standards zum Beispiel von Zend oder PEAR können verwendet werden oder es können auch eigene Coding-Standards mit neuen Regeln angelegt werden. Wie dies funktioniert, wird hier beschrieben: PHP Code Sniffer – Parameter und eigene Regelset. [...]


    • KingCrunch
      am 28. Juli 2009 um 23:36 Uhr

      Ich wurd kurz etwas stutzig: Die verlinkte API-Doc bezieht sich auf Version 0.6, aktuell ist 1.1 (stable) bzw 1.2 (beta). Diese Differenz von soll zu ist, ist schon auffällig.

      http://pear.php.net/package/PHP_CodeSniffer/docs/latest/


    • Volker Dusch
      am 18. August 2009 um 07:43 Uhr

      Genial ! Genau der anstoß den ich gebracht hab um das Tool nochmal anzugehen. Sehr feiner Artikel


    • Some Code Blog
      am 15. November 2009 um 12:20 Uhr

      PHP Tool Integration – PHP CodeSniffer…

      Als erstes Plugin möchte ich hier die Integration von PHP CodeSniffer vorstellen. Es war das erste Tool, welches über PHP Tool Integration (kurz PTI) integriert wurde. Es war auch der Grund, warum ich überhaupt das Projekt gestartet habe. Wir hatten au…


    • PHP Codesniffer – Regeln definieren mit ruleset.xml | DaRaFF's Blog
      am 3. September 2010 um 11:01 Uhr

      [...] einigen Monaten habe ich den CodeSniffer durch die Artikelserie von Nils auf phphatesme entdeckt. Der CodeSniffer wurde von mir direkt ausprobiert. Kurze Zeit später habe ich eigene [...]

    RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

    Hinterlasse einen Kommentar

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.