1. Einrücken
Um seine PHP-Skripte besser zu strukturieren sollten diese sauber eingerückt werden. Als Beispiel nehmen wir folgenden PHP-Code.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
function todo($str) {
for($i=0;$i<strlen($str);$i++) {
if("z" == $str[$i]) {
$str[$i]="1";
}else{
if("a" == $str[$i]) {
$str[$i]="2";
}else{
switch($str[$i])
case "b":case "c":
$str[$i]=1;
break;
case "c":
$str[$i]=0;
}
}
}
}
class Foobar {
private $bar;
public function __construct($a) {
$this->bar = $a;
}
public function ersetze() {
foreach($a as $value) {
if(is_string($value)) {
$value=todo($value);
}
}
}
}
$obj = new Foobar(array("x","z"));
$obj->ersetze();
?>
Es ist dabei Egal was dieser Code macht. Hieran ist zu erkennen dass keine Einrückung am Code vorgenommen wurde. Somit ist nicht leicht zu erkennen, wo ein Programmblock aufhört und wo der nächste anfängt. So kann man z.B. nicht verfolgen welche Anweisungen noch in einer Schleife stehen und welche nicht mehr. Das Verfolgen des PHP-Skriptes ist jedoch ein wichtiger Bestandteil wenn es darum geht das PHP-Skript zu überprüfen und eventuelle Fehler zu beseitigen. Daher beschreibt dieses Kapitel die Strategien wie Eingerückt werden.
Es ist egal wie genau eingerückt wird, hauptsache es wird eingerückt. Dabei sollte konsequent eingerückt werden und nicht nur sporanisch an einigen Stellen. Hier wird weitgehend nach dem PEAR Coding Standard eingerückt. Alle Regeln können auch dort nachgelesen werden. Des Weiteren werden hier alle Einrückungen mit 4 Leerzeichen realisiert, nicht mit Tabulatoren. Im Editor muss dies ggf. umgeschaltet werden, das bei einem Tabulator-Druck mit Leerzeichen eingerückt wird. Selbstverständlich gibt es beliebig viele Strategien wie eingerückt wird, siehe http://en.wikipedia.org/wiki/Indent_style.
2. Einrücken von Anweisungen und Funktionsaufrufen
Bei Funktionsaufrufen werden die Parameter üblicherweise (neben dem notwendingen Kommata) mindestens mit einem Leerzeichen getrennt. Somit ist sofort erkennbar was die Parameter einer Funktion sind. Bei sehr langen Parametern können diese auch untereinander geschrieben werden.
<?php
$str = str_replace('Foobar', 'FOOBAR', $str); // Leerzeichen zwischen Parametern
$str = name_xyz('Ein sehr verdammt langer Parameter',
'Weitere Parameter',
false,
array(1, 2, 4),
"foobar"); // Funktionsaufruf mit 5 Parametern, der 4. ist ein Array
?>
In anderen Teilen sollten zusätzliche Leerzeichen eingefügt werden, um deren Lesbarkeit zu erhöhen.
<?php
$var = "Text"; // <-- paar Leerzeichen vor dem Gleichheitszeichen
$langevar = "Text";
?>
3. If-Abfragen
Bei einer If-Abfrage wird der Inhalt vom Rumpf um eine Stufe eingerückt.
Die öffnende geschweifte Klammer wird mit einem Leerzeichen getrennt
hinter der If-Abfrage geschrieben, die schließende geschweifte Klammer
kommt in eine extra Zeile und wird auf Höhe der If-Abfrage geschrieben.
Nach dem Schlüsselwort if
wird ein Leerzeichen eingefügt.
<?php
if (bedingung) {
// Anweisungen
foobar();
barbli();
xyz();
$var = "x";
}
?>
Wenn die If-Abfrage einen else
oder else if
Teil enthält wird dieser hinter der geschweiften Klammer geschrieben,
auch wieder mit einem Leerzeichen getrennt.
<?php
if (bedingung) {
tu_das();
} else if (bedingung2) {
mach_dies();
} else {
dann_halt_das();
}
?>
4. Schleifen
Bei Schleifen wird der Inhalt des Schleifenrumpfs wie bei einer If-Abfrage um eine Stufe eingerückt. Die öffnende geschweifte Klammer wird mit einem Leerzeichen hinter dem Schleifenkopf geschrieben, die schließende Klammer wird auf eine extra Zeile geschrieben.
<?php
while (bedingung) {
arbeite();
}
?>
Bei einer For-Schleife werden die einzelnen Teile zusätzlich mit einem Leerzeichen getrennt, die Teile selbst enthalten üblicherweise keine Leerzeichen.
<?php
for ($i=0; $i<10; $i++) {
arbeite();
}
?>
Der selbe Stil wird für do-while
- und foreach
-Schleifen
verwendet.
<?php
do {
arbeite();
} while (bedingung);
foreach ($array as $value) {
arbeite($value);
}
?>
5. Funktionsdefinitionen
Eine Funktionsdefinition sollte immer ein PHPDoc-Kommentar besitzen. So kann
jeder Entwickler nachlesen was diese Funktion leisten soll und was sie macht.
Die Parameter einer Funktion werden zusätzlich zum Kommata mit einem
Leerzeichen getrennt. Die geöffnete geschweifte Klammer wird mit einem
Leerzeichen getrennt hinter der Parameterliste angehängt.
Die geschlossene geschweifte Klammer kommt in eine extra Zeile auf Höhe des Schlüsselworts
function
. Der Funktionsrumpf wird nun dabei um eine
Stufe eingerückt.
<?php
/**
* PHPDoc zur Funktion foobar
*/
function foobar($bar, $bla) {
arbeite($bar);
arbeite($bla);
}
?>
6. Einrücken von Klassen
Klassen werden nach dem selben Stil eingerückt. Die einzelnen Eigenschaften und Methoden werden untereinander zusätzlich von einer Leerzeile getrennt. Wie bei den Funktionen gehören (besonders) auch bei Klassen PHPDoc-Kommentare die die einzelnen Elemente beschreiben.
<?php
/**
* PHPDoc zu Foobar
*/
class Foobar {
/**
* PHPDoc zu $xyz
*/
private $xyz;
/**
* PHPDoc zu XYZ()
*/
public function XYZ() {
arbeite();
}
}
?>
7. Switch Einrücken
Switch-Abfragen folgen dem selben Einrückstil wie die anderen Programmteile.
Die case
Anweisungen werden jedoch auf Höhe des switch
-Schlüsselworts
geschrieben. Das heißt das vom Schritt switch
->case
->Programmcode
nicht zwei mal eingerückt wird sondern nur einmal. Das break;
(falls vorhanden)
bleibt dabei auf der Höhe der Einrückung.
<?php
switch ($var) {
case 'z':
arbeite();
break;
case 'y':
arbeite();
default:
arbeite();
}
?>
8. Einrücken des Beispielcodes
Als Beispiel wird nochmal der Code von oben eingerückt. Hier der ursprüngliche PHP-Code.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
function todo($str) {
for($i=0;$i<strlen($str);$i++) {
if("z" == $str[$i]) {
$str[$i]="1";
}else{
if("a" == $str[$i]) {
$str[$i]="2";
}else{
switch($str[$i]) {
case "b":case "c":
$str[$i]=1;
break;
case "c":
$str[$i]=0;
}
}
}
}
}
class Foobar {
private $bar;
public function __construct($a) {
$this->bar = $a;
}
public function ersetze() {
foreach($a as $value) {
if(is_string($value)) {
$value=todo($value);
}
}
}
}
$obj = new Foobar(array("x","z"));
$obj->ersetze();
?>
Und nun wie er sauber eingerückt wird.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
/**
* PHPDoc zu Todo
*/
function todo($str) {
for($i=0; $i<strlen($str); $i++) {
if ("z" == $str[$i]) {
$str[$i]="1";
} else { // besser zu einem else if()
if ("a" == $str[$i]) { // zusammenfassen, um eine Einrückungstiefe zu sparen
$str[$i]="2";
} else {
switch ($str[$i]) {
case "b":
case "c":
$str[$i]=1;
break;
case "c":
$str[$i]=0;
}
}
}
}
}
/**
* PHPDoc zu Foobar
*/
class Foobar {
/**
* PHPDoc zu $bar
*/
private $bar;
/**
* PHPDoc zum Konstruktor
*/
public function __construct($a) {
$this->bar = $a;
}
/**
* PHPDoc zu ersetze()
*/
public function ersetze() {
foreach ($a as $value) {
if (is_string($value)) {
$value = todo($value);
}
}
}
}
$obj = new Foobar(array("x","z"));
$obj->ersetze();
?>