[PHP] High Quality PHP-Code – Teil 1 Code-Style

[PHP] High Quality PHP-Code – Teil 1 Code-Style

Hi, ich habe schon einiges an PHP-Code gesehen (und auch selber geschrieben) und vieles davon ist alles andere als schön. Ich möchte euch in diesem Tutorial zeigen, wie man die Code-Qualität steigern und damit anderen den Support, das Debugging, die Weiterentwicklung, etc. erleichtern kann. Und so ganz nebenbei, die PHP-Profis kochen auch nur mit Wasser ;).

Das Wichtigste am Code ist ein einheitlicher Stil.
Dazu zählen folgende Aspekte:
  • Maximale Zeilenlänge
  • Art der Zeilenumbrüche (Windows oder UNIX/Linux)
  • Zeichen für die Einrückung (Tabs oder Spaces)
  • Wenn Spaces zur Einrückung genutzt werden, die Anzahl pro Schritt
  • Konventionen für Operatoren
  • Konventionen für die Variablennamen
  • Konventionen für die Funktions- und Methodennamen
  • Konventionen für Kontrollstrukturen (if und switch)
  • Konventionen für Schleifen (for, foreach, while, do)
  • Konventionen für Klassen- und Methodenrümpfe (Position der geschweiften Klammer)
Das hört sich nach viel viel trockenem und unnützem Zeugs an. Ihr werdet recht schnell feststellen, dass das Einhalten von Code-Styles recht einfach ist und Vorteile bringt.

1. Zeilenlänge, Zeilenumbrüche und Einrückung

Ihr solltet euch an eine maximale Zeilenlänge halten und diese in keinem Fall überschreiten. Damit kann man unnützes horizontales Scrollen in der IDE verhindern. Früher war diese Grenze bei 80 Zeichen pro Zeile, Mittlerweile sind 120 Zeichen üblich.
Die anderen beiden Dinge sind für die Darstellung in Editoren bzw. IDEs wichtig. Da die meisten PHP-Skripte unter einen unixoiden Betriebssystem laufen werden, empfiehlt es sich immer UNIX/Linux Zeilenumbrüche zu benutzen (auch wenn Notepad damit nicht umgehen kann).
Werden für die Einrückungen Tabs benutzt, so kann sich der Code optischen von IDE zu IDE unterscheiden. Je nachdem wie die Schrittweite für Tabs eingestellt ist. Aus diesem Grunde sollte man hier Spaces verwenden, Dabei sollte eine Einrückungsstufe vier Leerzeichen entsprechen.


2. Operatoren

Es gibt mehrere Möglichkeiten um Operatoren von Operanden zu trennen.
Variante eins: Platzsparen. Kann man machen sieht aber nicht gut aus.
PHP:
$my_var = $a.$h."foo".$m."j".$x.$i."bar".$z;
$line_count = $z1+$z2/6*13-$xv29+pow(38,2);
Wer schafft es diese zwei Zeilen innerhalb von 30 Sekunden zu verstehen? Ich jedenfalls nicht.

Um das ganze besser lesbar zu gestalten, trennen wir die Operatoren mit Leerzeichen.
PHP:
$my_var = $a . $h . "foo" . $m . "j" . $x . $i . "bar" . $z;
$line_count = $z1 + $z2 / 6 * 13 - $xv29 + pow(38, 2);
Zumindest ist Zeile zwei besser Verständlich.


3. Konventionen für Variablen-, Funktions- und Methodennamen

Die Namen von Variablen, Funktionen und Methoden sollten auch einheitlich "gestaltet" werden. Mit zunehmender Erfahrung hat sich herausgestellt, dass Camel-Case am verständlichsten ist. Des Weiteren sollten sie in Englisch geschrieben sein.

Achtet im folgenden Beispiel, mal darauf,welchen Code ihr schneller erfasst habt.

PHP:
function generate_my_code($paramter_one) {
    echo "foobar".$my_var;
}

PHP:
function echoFooBar($firstParameter) {
    echo "baz" . $firstParameter;
}
Ich habe bewusst unterschiedliche Beispiele genommen, nur die Grundstruktur ist bei beiden gleich.
Beispiel 1: Namen mit Unterstrichen
Beispiel 2: Namen in Camel-Case


4. Kontrollstrukturen und Schleifen

Auch bei den ganzen if's, for's gibt es Stilregeln. Diese Regeln bestimmen die Position der Bedingungen und der geschweiften Klammern. Von der if...endif; Syntax rate ich ab, da man dort den Block nur schwer erkennt. Analog gilt gleiches für for und foreach.
Auch hier kann man den Code wieder platzsparend gestalten, aber das ist aus meiner Sicht unübersichtlich.

PHP:
if($a==$b){
}
switch($x){
case "z":
doSomething();
break;
default:
DoSomethingElse();
}
Fügen wir hier einfach mal ein Paar Leerzeichen ein:
PHP:
if ($a == $b) {
}
switch ($x) {
    case "z":
        doSomething();
        break;
    default:
        DoSomethingElse();
}


5. Konventionen für Klassen- und Methodenrümpfe

Und auch hier sind die Positionen der (geschweiften) Klammern und Leerzeichen bei Parametern interssant.

Hier will ich nur zwei Beispiele zeigen, da ich mich sonst zu oft wiederhole.
PHP:
function myFunction($firstParam,$secondParam){
    // some code
}

PHP:
function myFunction($firstParam, $secondParam)
{
    // some code
}

Bevor ich zum Schlusswort komme nochmal ein komplettes Beispiel:
Platzsparend
PHP:
<?php
class MyObject{
private $array;
private $string;
public function __contruct($firstParam,$secondParam=null){
if(is_array($firstParam)){
$this->array=$array;
}

if($secondParam!==null && is_string($secondParam)){
$this->string=(string)$secondParam;
}
}
}

Und das ganze mit einheitlichem Code-Stil:
PHP:
class MyObject
{
    private $array;
    
    private $string;
    
    public function __contruct($firstParam, $secondParam=null)
    {
        if (is_array($firstParam)) {
            $this->array=$array;
        }

        if ($secondParam!==null && is_string($secondParam)) {
            $this->string=(string)$secondParam;
        }
    }
}

Einige denken jetzt sicher "ach der Code ist nur für mich, da brauche ich so etwas nicht". Das dachte ich auch einmal, aber im Laufe der Zeit wurde die Pflege des Codes immer schwieriger. Und auch bei einem Hilferuf (z.B. hier im Forum) ist es für die Helfenden leichter das Problem zu lösen, wenn sie sauberen Code zu sehen bekommen.

Das ganze würde nur wenig bringen, wenn es dafür nicht Unterstützung durch Tools gäbe.
Das Tool PHP_CodeSniffer führt eine statische Code-Analyse durch und sagt euch, wo ihr gegen den Code-Stil verstoßen habt. Persönlich nutze ich eine modifizierte Version des Zend Conding Standards.

Das war es zu Teil 1 meiner Serie. Im zweiten Teil wird es um objektorientierte Programmierung (OOP) und Unit-Tests gehen.


Gruß Kyoya Stefan

PHP-Developer bei der Mayflower GmbH
Autor
Kyôya
Aufrufe
2.947
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen
Zurück