Guter Code mit PHP

In meiner Mini-Serie zur Softwareentwicklung in PHP mit dem Vim-Editor geht es nach der Auswahl der optimalen Vim-Konfiguration nun um die PHP-Werkzeuge, die zur Prüfung der Sourcecode-Qualität eingesetzt werden können.

Für nachnutzbaren Sourcecode genügt es nicht, die Syntax einer Sprache, grundlegende Programmiertechniken und ein paar Programmbibliotheken zu beherrschen. Vielmehr entwickeln bei Open Source Projekten die Communities
Coding Standards, wie in Python mit PEP8, in PHP neuerdings mit PSR-1 und PSR-2 oder Drupal mit seinen Coding Standards. In diesen Coding Standards werden z.B. Benennungsregeln für Variablen, Funktionen und Klassen, Dokumentationsvorgaben und Formatierungsregeln definiert.

Neben diesen Coding Standards sollen mittels weiterer Metriken potenzielle Fehlerquellen (Code smells) erkannt werden: Variablen mit sehr kurzen Namen, zu viele Verschachtelungsebenen in Kontrollstrukturen, fehlenden Dokumentation der Schnittstellen von Funktionen, etc.

In PHP-Projekten stehen für derlei Analysen1 die passenden Werkzeuge zur Verfügung (auch wenn man keine IDE verwendet). Im Folgenden sollen ein paar von ihnen vorgestellt werden. Ich nutze das Drupal-Core-Project2 als Analysegegenstand.

Syntax-Analyse

Ein Syntax-Check wird praktischerweise mit dem PHP-Interpreter durchgeführt:

$ php -l core/includes/database.inc

Es wird jeweils der erste gefundene Syntaxfehler angezeigt. So kann es eine Weile dauern, bis alle Fehler behoben worden sind.

Coding Standards

Für die Überprüfung der Coding Standards dient PHP_CodeSniffer. Es wird mit (fast) allen Linux-Distributionen und dank Homebrew für OSX3 mitgeliefert.

$ phpcs core/includes/database.inc

Alle Verstöße gegen die Coding Standards werden zeilenweise mit Angabe von Dateiname, Fehlerposition, Schwere (Warnung oder Fehler) und kurzer Beschreibung gelistet.

Da die Drupal Coding Standards von den PHP_CodeSniffer-Voreinstellungen abweichen müssen die Drupal Coding
Standards angegeben werden. Die Coding Standards werden als CodeSniffer-Regeln im coder.module

$ drush dl coder
$ phpcs \
    --standard=modules/coder/coder_sniffer/Drupal/ruleset.xml \
    core/includes/database.inc

Code smells

Das Werkzeug zum Aufspüren von Code smells ist PHP Mess Detector (phpmd), welches ein PHP-Pendant zum PMD aus der Java-Welt ist. Es wird ebenfalls mit (fast) allen Linux-Distributionen und dank Homebrew für OSX3 mitgeliefert.

$ phpmd core/modules/node/node.module text \
    "cleancode,codesize,controversial,design,naming,unusedcode"

Das Programm erwartet drei Aufrufparameter: Die zu untersuchenden Datei oder Ordner, das Report-Format sowie das Regelset. Wenn phpmdauf einen Ordner angewendet wird, dann müssen die drupal-spezifischen Dateisuffixe beim Programmaufruf angegeben werden, um als PHP-Dateien erkannt zu werden:

$ phpmd core/modules/node/ text "cleancode,codesize" \
    --suffixes=module,inc,install,test,php,theme

Auch hier werden alle Verstöße gegen die Regelsets zeilenweise mit Angabe von Dateiname, Fehlerposition und kurzer Beschreibung gelistet.

Geht es auch einfacher?

Natürlich. Für diese Werkzeuge sollte es Integrationspakete für alle nennenswerten Programmiersprachen, Editoren und IDEs geben. In meinem nächsten Blogpost werde ich die Integration in Vim vorstellen, für das Syntastic-Erweiterung verantwortlich ist. Es ist aber immer gut zu wissen, was da „unter der Haube“ passiert.

Update: PHP_CodeSniffer ist nicht mehr in Homebrew-Repo enthalten. Es lässt sich aber über PEAR leicht nachinstallieren:

$ sudo pear install PHP_CodeSniffer

Update 2: Mittlerweile ist PHP_CodeSniffer wieder via Homebrew als homebrew/php/php-code-sniffer zu haben. Danke an Daniel für den Hinweis im Kommentar.


  1. Man spricht dabei von statischer Code-Analyse↩︎
  2. git clone --branch 8.x http://git.drupal.org/project/drupal.git ↩︎
  3. brew tap homebrew/php; brew install homebrew/php/php-code-sniffer ↩︎ ↩︎