PHP Coding Standard - Regeln und Empfehlungen

Die Seite wird erstellt Heinrich Hamann
 
WEITER LESEN
PHP Coding Standard

PHP Coding Standard - Regeln und
Empfehlungen
Autor: Claus van Beek
Vorlagen: Programming in C++ - Rules and Recommendations (written by
Mats Henricson and Erik Nyquist) | PHP Coding Standard (rewritten for PHP
by Fredrik Kristiansen) | phpBB Coding Guidelines
Homepage: http://php-coding-standard.de

Mittwoch, 15. Oktober 2008 - Copyright 2008                      Seite: 1
by Claus van Beek
PHP Coding Standard

Table Of Contents

1. Vorwort ................................................................................................................................ 4
2. Sinn und Zweck eines Coding Standard ............................................................................. 6
3. Regel 0: Immer wenn eine Regel gebrochen wird, muss das deutlich und erkennbar
dokumentiert werden ............................................................................................................... 8
4. Regel 1: Das Prinzip der Einfachheit - Struktur und Übersichtlichkeit................................. 9
5. Regel 2: Dateien, die inkludiert werden, sollten mit "*.inc.php" enden oder in einem
Unterverzeichnis liegen ......................................................................................................... 11
6. Regel 3: Jede PHP-Datei muss das Copyright und einen Kommentar enthalten, der die
Funktionalität beschreibt........................................................................................................ 12
7. Regel 4: Die Sprache für Kommentare und Bezeichner sollte Englisch sein .................... 14
8. Regel 5: Jede Datei wird mit Änderungskommentaren und einem Zeitstempel versehen 15
9. Regel 6: Jede Funktion muss mit Kommentaren versehen werden .................................. 16
10. Regel 7: Lange Kommentare sollten mit /* und kurze Kommentare mit // gemacht
werden................................................................................................................................... 18
11. Regel 8: Alle Bezeichner werden aussagekräftig und eindeutig definiert........................ 20
12. Regel 9: Benennung von Variablen und Funktionen erfolgen mit Unterstrich und in
Kleinbuchstaben .................................................................................................................... 22
13. Regel 10: Konstanten werden in Großbuchstaben defniert............................................. 23
14. Regel 11: Auf keinen Fall Abkürzungen verwenden, die zweideutig sein können .......... 24
15. Regel 12: Funktionen, Parameter und Rückgabewerte gut dokumentieren.................... 26
16. Regel 13: Die Klammern für eine Funktion () stehen direkt am Funktionsnamen ........... 28
17. Regel 14: Funktionen mit langen oder vielen Parametern müssen übersichtlich notiert
werden................................................................................................................................... 29
18. Regel 15: Der Code muss vom Design getrennt werden (Template Engine).................. 30
19. Regel 16: Alle Templates müssen validiert werden......................................................... 32
20. Regel 17: Bezeichner einer Klasse werden mit Großbuchstaben voneinander getrennt 33
21. Regel 18: Keine magischen Zahlen................................................................................. 34
22. Regel 19: SQL-Befehle werden groß geschrieben.......................................................... 35
23. Regel 20: Variablen in Zählschleifen werden mit einem Buchstaben definiert................ 36
24. Regel 21: Trinitäts-Operatoren dürfen nicht verschachtelt werden ................................. 37
Mittwoch, 15. Oktober 2008 - Copyright 2008                                                                                  Seite: 2
by Claus van Beek
PHP Coding Standard

25. Regel 22: INSERT-Anweisungen müssen die einzelnen Spalten für die VALUES-Klausel
enthalten................................................................................................................................ 38
26. Regel 23: Code, der nicht benutzt wird, muss gelöscht werden...................................... 39
27. Empfehlung 1: Geschweifte Klammern werden im Allman-Stil eingerückt...................... 40
28. Empfehlung 2: Jede Kontrollstruktur hat einen Block mit Klammern............................... 42
29. Empfehlung 3: Zum Einrücken von Quellcode werden Tabulatoren verwendet.............. 44
30. Empfehlung 4: Die Benutzung von Zahlen in Bezeichnern ist zu vermeiden .................. 46
31. Empfehlung 5: Es sollte Subversion und ein Bugtracker-System benutzt werden.......... 47
32. Empfehlung 6: Keine Anführungsstriche bei String-Deklarationen.................................. 48
33. Empfehlung 7: Debug-Informationen von Anfang an einbinden...................................... 49
34. Empfehlung 8: Werte für FOR-Schleifen richtig setzen................................................... 50
35. Richtig und Falsch 1: Klammern setzen und Abkürzungen............................................. 51

Mittwoch, 15. Oktober 2008 - Copyright 2008                                                                                 Seite: 3
by Claus van Beek
PHP Coding Standard

 1. Vorwort

 Bevor ich hier auf die verschiedenen Vorteile des PHP Coding Standards eingehe, möchte ich den
 Autoren des Originals (für C++):

 •    Mats Henricson
 •    Erik Nyquist

 und dem Übersetzer "Joseph Supanich" danken. Ohne diese drei Personen wäre dieser Coding
 Standard nicht möglich gewesen. Außerdem habe ich mich von Paul Waring und Fredrik Kristiansen
 inspirieren lassen.

 Anstatt Name wird im Coding Standard oft das Wort "Bezeichner" verwendet. Gültige
 Programmierbeispiele werden farblich von ungültigen abgehoben. So ist leichter zu erkennen, wo der
 PHP Coding Standard eingehalten wird und wo nicht.
 Wenn im Text das Wort "Variable" steht und es um den Bezeichner bzw. die Definition eines
 (Variablen)Namens geht, so kann an die Stelle auch "Funktion", "Konstante" etc. stehen. Die
 Namenskonvention für Bezeichner sind global gültig. Ausnahmen, zum Beispiel für
 Namenskonventionen bei Klassen, werden explizit aufgeführt und erklärt.

 Es gibt jetzt schon einige Coding Standards für PHP. Die Auswahl sollte einem Programmier-Team
 nicht schwer fallen, aber sorgfältig gemacht werden, denn ein Coding Standard hat keinen Sinn,
 wenn er nicht von allen Programmierern eingehalten wird.

 Sinn und Zweck dieses Dokuments ist nicht, einen einzigen gültigen PHP Coding Standard zu
 entwerfen. Es wird in jedem Team bestimmte Anforderungen und Vorlieben geben. Das ist ok.
 Es ist nicht ok, wenn jeder Programmierer seinen Vorlieben nachgibt und eine Variable, mal so und
 mal anders benennt. Dieses muss durch Kontrollen und Teamwork, am besten durch Extreme
 Programming, sichergestellt werden. "Extreme Programming" wird hier genannt, weil es das "Pair
 Programming" vorschlägt, das automatisch ein 4-Augen-Prinzip enthält.

 Wenn man sich für einen Coding Standard entschieden hat, sollten alle Änderungen, die man
 vornimmt, schriftlich niedergelegt werden. Jede Regel, die vom Team abgelehnt wird, sollte
 abgeändert oder gelöscht werden. Jedoch muss beides dokumentiert werden, schon damit sich jeder
 an die Änderung halten kann. Auch neue Mitglieder im Team werden sich dann leichter zurechtfinden
 und keine Regeln befolgen, die veraltet sind.
 Wenn Sie es vorziehen allein zu arbeiten, brauchen Sie keinen Coding Standard. Sie brauchen auch
 keine Kommentare oder sprechende Variablen. Aber wenn Sie planen, Ihr Projekt zu veröffentlichen
 (zum Beispiel bei sourceforge.net), dann sollten Sie es von Anfang an richtig machen. Gerade in der
 PHP-Welt ist die Wahrscheinlichkeit groß, dass Sie bei einem GPL-Projekt Hilfe bekommen. Früher
 oder später werden sich diese Helfer Ihren PHP-Code ansehen und das Ergebnis sollte sich doch
 sehen lassen können, oder?

Mittwoch, 15. Oktober 2008 - Copyright 2008                                              Seite: 4
by Claus van Beek
PHP Coding Standard

 Zu meiner Person: Ich, Claus van Beek, bin in fünf große Projekte involviert gewesen oder ich bin es
 noch. Bis auf eine Ausnahme, haben alle Projekte ohne Coding Standard angefangen und es wurden
 nahezu keine Tests durchgeführt. Konzepte wie Extreme Programming und/oder Refactoring wurden
 nie beachtet, obwohl diese Konzepte älter als PHP4 und PHP5 sind.
 Beim XMB wurde zu Testzwecken das Feld "dummy" in die Datenbank eingefügt. Die Spalte blieb
 jedoch in allen RCs und der endgültigen Version erhalten. Nur deswegen musste zusätzliche Arbeit in
 das "ugrade.php" gesteckt werden.
 In Papoo (Version 3.0) gibt es redundante und viele leere Felder in der Datenbank. Feststehende
 Begriffe wie "LAN" (Local Area Network) werden als Abkürzung für "language" verwendet.
 Schnittstellen von Methoden werden so gut wie nie dokumentiert. Die gewachsenen Strukturen
 wuchern immer mehr aus.

 Oft höre ich auch Aussagen wie
 "Das ist nur ein Test-Skript"
 das bedeutet dann ungefähr: "Ich mache die Doku und die Kommentare später", aber viel zu oft
 passiert das nicht.

 Zitat eines unbekannten Programmierers
 Man hat anscheinend immer die Zeit alles zweimal zu machen, aber es fehlt immer die Zeit, es
 von Anfang an richtig zu machen.

 Ich dachte, ich hätte dieses Zitat irgendwo gelesen, aber Google findet dieses Zitat nicht. Da ich in
 meinen Projekten den Azubis immer wieder predige: "Erst Strukturen, dann Coden, dann Tests",
 musste ich dieses Zitat jedoch verwenden. Das Extreme Programming geht davon aus, dass erst die
 Modultests und dann der Code geschrieben wird. Ich stehe diesem Ansatz kritisch gegenüber, weil
 das schreiben von Tests manchmal ähnlich aufwendig ist, wie die Programmierung selbst. Die
 meisten Firmen und Programmierer arbeiten aber mit nur ganz wenigen Strukturen und verzichten
 auf automatisierte Tests. Ohne Refactoring, ohne (Modul)Tests und ohne PHP Coding Standard sind
 wachsende, ausufernde Strukturen und unverständlicher Programmcode unvermeidbar. Irgendwann
 kann das Projekt niemand mehr kontrollieren und die Fehlersuche wird enorm erschwert. Um das zu
 verhindern, müssen alle PHP-Projekte einen

 •    Coding Standard
 •    Refactoring
 •    Modul- und andere Tests

 einsetzen, um die Qualität der Software sicher zu stellen. Andere Verfahren wie
 Bug-Tracker-Systeme (wie Mantis) haben sich ebenfalls etabliert.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                               Seite: 5
by Claus van Beek
PHP Coding Standard

 2. Sinn und Zweck eines Coding Standard

 Wenn man dem Extreme Programming folgt, wird man wissen, dass die Einhaltung eines Coding
 Standards ein wichtiger Bestandteil der gesamten Projektarbeit ist. Darüber hinaus gibt es jedoch
 auch andere wichtige Faktoren:

 •    Kommunikation
 •    Urlaubsvertretung
 •    funktionierender Code
 •    übersichtlicher Code
 •    Module und Modultests
 •    Wiederverwendbarkeit des Codes
 •    einfache Wartung des Codes
 •    Code, der leicht zu erweitern ist
 •    Unterstützung von Refactoring

 um nur einige zu nennen. Bis auf den Punkt "Kommunikation" unterstützt ein Coding Standard alle
 genannten Punkte. Selbst die Urlaubsvertretung wird einfacher, denn wenn jeder den Code des
 anderen versteht, kann man auch schnell Bug-Fixes vornehmen oder Module des anderen
 verwenden ohne das Rad neu zu erfinden.

 Zitat von Martin Fowler ("Refactoring - Improving the design of existing code", Seite 15)
 Any fool can write code that a computer can understand. Good programmers write code that
 humans can understand.

 Um diese Ziele zu erreichen, muss eine PHP-Applikation

 •    leicht zu lesen
 •    leicht verständlich
 •    gut dokumentiert
 •    durch verschiedene Programmierer wartbar
 •    frei von typischen Fehlern

 sein. Im besten Falle kann sogar ein Kunde die Module der PHP-Applikation verstehen und weiter
 verwenden. Wenn man das nicht möchte, so ist die logische Schlussfolgerung nicht Kommentare und
 Struktur wegzulassen, sondern den PHP-Code zu verschlüsseln, zum Beispiel mit dem Zend Guard
 oder dem PHP Encoder.
 Das Ziel von leicht verständlichem Source-Code ist erreicht, wenn jedes Mitglied des Teams, jedes
 Modul aus dem Stehgreif erklären kann. Nicht zuletzt soll jede Arbeit am Projekt, dem Code und der
 Dokumentation Spaß machen. Je höher der Frustfaktor ist, je unübersichtlicher Strukturen und Code
 sind, desto höher ist die Wahrscheinlichkeit, das die Arbeit keinen Spaß mehr macht. Das gilt es auf
 jeden Fall zu verhindern.

 Es folgen die Regeln, die einzuhalten und nicht gebrochen werden sollten. Im Gegensatz dazu
 stehen die Empfehlungen, denen man nicht folgen muss. Als letztes kommt "Richtung und Falsch".
 Die Beispiele hier sollen die Regeln und Empfehlungen verdeutlichen.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                               Seite: 6
by Claus van Beek
PHP Coding Standard

Mittwoch, 15. Oktober 2008 - Copyright 2008   Seite: 7
by Claus van Beek
PHP Coding Standard

 3. Regel 0: Immer wenn eine Regel gebrochen wird, muss das deutlich und erkennbar
 dokumentiert werden

 Dies ist die wichtigste Regel, denn sie erlaubt zum einen Freiheit und erfordert zum anderen genaue
 Dokumentation, warum man sich für einen Bruch der Regeln entschieden hat. Auch beim Brechen
 von Regeln sollte das Prinzip der Einfachheit weiter angewendet werden. Beispiel: Sie wollen zwei
 Variablen miteinander vergleichen und das Ergebnis "$boolean" zuweisen. Die erste Variante ist die
 einfachste, aber es gibt mehrere Möglichkeiten das zu programmieren:

 Gültig
     // gültiger PHP Coding Standard
     $boolean = (15 > 9);

 Gültig
     // gültiger PHP Coding Standard
     if (15 > 9)
     {
        $boolean = TRUE;
     }
     else
     {
        $boolean = FALSE;
     }

 Ungültig
     // ungültiger PHP Coding Standard
     if (15 > 9)
        $boolean = TRUE;
     else
        $boolean = FALSE;

 Gültig
     // gültiger PHP Coding Standard
     $boolean = (15 > 9) ? TRUE : FALSE;

 Das Beispiel zeigt kurze und ausführliche Programmierung. In jedem Fall wird mit
 "var_dump($boolean);" der Wert "bool(true)" ausgegeben. Das dritte Beispiel ist nach dem PHP
 Coding Standard ungültig, weil die geschweiften Klammern fehlen. Würde das Fehlen und der Grund
 genau dokumentiert werden, hätte man Regel 0 beachtet. In dem hier dargestellten Fall sollte man
 nach dem Prinzip der Einfachheit die erste Variante wählen.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                              Seite: 8
by Claus van Beek
PHP Coding Standard

 4. Regel 1: Das Prinzip der Einfachheit - Struktur und Übersichtlichkeit

 Das Prinzip der Einfachheit besagt: "Mache alles so einfach wie möglich!" Wenn man also eine lange
 und komplizierte Funktion durch eine Klasse mit vier oder fünf übersichtlichen Methoden ersetzen
 kann, so ist der Aufwand nahezu immer gerechtfertigt. Kann man komplexe und unstrukturierte
 iterative Programmierung durch eine elegante Rekursion ersetzen, sollte man diese Arbeit nicht
 scheuen. Diese Arbeit gehört zum Programmieren, sie ist ein Teil des Refactoring.

 Zitat von Steve Krug ("Don't make me think! Web Usability", Seite 11)
 Die Leute fragen mich oft:
 "Wenn ich ich sichergehen will, dass meine Webseite einfach zu benutzen ist, was ist das
 Wichtigste, das ich beachten muss?"
 Die Antwort ist einfach. Sie lautet nicht: "Alles Wichtige darf nicht mehr als zwei Klicks entfernt
 sein" oder "Sprich die Sprache der User" oder auch "Sei konsistent". Sie lautet ...
 "Don't make me think!"
 Seit Jahren erzähle ich Leuten, dass dies mein Erstes Gesetz zur Usability ist. Und je mehr
 Webseiten ich mir anschaue, desto überzeugter bin ich davon.

 Steve Krug navigiert mit dem Auto lieber durch Los Angeles als durch Boston, weil die
 Straßenschilder deutlich zu sehen und die Straßennamen in großen Buchstaben geschrieben sind. Er
 widmet ein Kapitel der Navigation im Baumarkt und vergleicht sie mit der Navigation im Web. Was
 mögen die Menschen lieber ... einen gut sortierten Supermarkt mit großen Schildern ("Süßigkeiten",
 "Backwaren", "Obst und Gemüse", etc.) oder einen unübersichtlichen Supermarkt ohne Schilder?

 Das Prinzip der Einfachheit findet man überall im Leben, aber in der Programmierung wird es nur
 selten angewendet. Hier ist oft das Hauptprinzip: "Hauptsache es läuft!". Es sollte jedoch das Prinzip
 der Einfachheit sein. Code sollte modular, wartbar und wiederverwendbar sein.

 Zitat von Jörg Krause ("PHP5 - Grundlagen und Profiwissen", Seite 349)
 Code-Konventionen sind (aus Sicht des PHP-Parsers) unverbindliche Vorschriften oder
 Empfehlungen zur Schreibweise von Variablen und Funktionen. (...) Neben den vielen
 Vorschriften, die eine Programmier- oder Skript-Sprache ausmachen, gibt es auch eine Reihe von
 Empfehlungen, die Programmierern helfen, gut lesbare und saubere Programme zu schreiben.
 Die Code-Konventionen sind solche Empfehlungen. Dabei geht es auch um die Pflege der
 Programme durch andere Programmierer oder später durch Sie selbst. Oft entstehen Programme
 unter großem Zeitdruck, die nötige Kommentierung und Dokumentation wird nur mangelhaft
 möglich sein. Die für jede Sprache geltenden Konventionen erleichtern dann das Einarbeiten in
 fremden oder eigenen Code.

 Zum Prinzip der Einfachheit gehören automatisch Struktur und Übersichtlichkeit. Der PHP Coding
 Standard wird hier verschiedene Mechanismen erklären, um das zu erreichen. Der weltweit
 wichtigste und weitverbreiteste Standard ist das Einrücken von Code. Es gibt viele unterschiedliche
 Meinungen zu "Tabs vs. Spaces" (Tabulatoren oder Leerzeichen), sowie die Frage "2, 4 oder 8
 Leerzeichen?" beim Einrücken. Hier muss sich das Team einigen.
 Die vielen Beispiele in diesem Dokument werden das Einrücken von Code besser erklären, als jede
 abstrakte Formel.
Mittwoch, 15. Oktober 2008 - Copyright 2008                                                    Seite: 9
by Claus van Beek
PHP Coding Standard

Mittwoch, 15. Oktober 2008 - Copyright 2008   Seite: 10
by Claus van Beek
PHP Coding Standard

 5. Regel 2: Dateien, die inkludiert werden sollten, mit "*.inc.php" enden oder in einem
 Unterverzeichnis liegen

 Es ist besser ein Unterverzeichnis ("include" oder "inc") für die Dateien anzulegen, die per include()
 oder ähnlichen Befehlen inkludiert werden. Oft werden hier Verzeichnisse wie "lib" oder "class"
 verwendet. Das widerspricht jedoch dem Prinzip der Einfachheit, weil der Name "include" für jeden
 PHP-Programmierer eine eindeutige Verbindung zum gleichnamigen PHP-Befehl herstellt. Das
 INCLUDE-Verzeichnis kann auch für CSS- und JavaScript-Dateien verwendet werden. Empfohlen
 wird jedoch ein eigenes Unterverzeichnis (zum Beispiel: "css_javascript").

 Möchte man, aus welchen Gründen auch immer, alle INCLUDE-Dateien im Hauptpfad ablegen, so
 muss die Dateiendung "*.inc.php" verwendet werden. "*.inc" reicht nicht aus, weil diese Dateiendung
 standardmäßig nicht geparst wird und demnach alle Informationen der Datei (auch Passwörter) im
 Klartext vorliegen.

 Ausnahme zu Regel 2: Wenn das Team sich für eine Struktur entscheidet, die jedem Mitglied intuitiv
 und einfach erscheint, sollte diese Struktur verwendet werden.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                                Seite: 11
by Claus van Beek
PHP Coding Standard

 6. Regel 3: Jede PHP-Datei muss das Copyright und einen Kommentar enthalten, der die
 Funktionalität beschreibt

 Der C++ Coding Standard geht davon aus, dass in jeder Datei mit Source Code auch der Dateiname
 erwähnt wird. Dieses Konzept erscheint mir unlogisch, weil der Dateiname beim Bearbeiten und
 Drucken bekannt sein sollte. Trotzdem steht es jedem Entwickler frei, den Dateinamen mit in den
 Kopf einer Datei aufzunehmen.

 Gültig
     //   +----------------------------------------------------------------------+
     //   | Copyright (c) 2002-2006 Claus van Beek               |
     //   +----------------------------------------------------------------------+
     //   | This describes the following script. Basic information is provided. |
     //   | "LAN" = Local Area Network. Other Abbrivations are not used in this |
     //   | script.                                                              |
     //   +----------------------------------------------------------------------+
     //   | This library is free software; you can redistribute it and/or        |
     //   | modify it under the terms of the GNU Lesser General Public           |
     //   | License as published by the Free Software Foundation; either         |
     //   | version 2.1 of the License, or (at your option) any later version.   |
     //   +----------------------------------------------------------------------+

 Das Copyright sollte zur Wahrung der eigenen Rechte oder der gewählten Lizenz in jeder PHP-Datei
 erwähnt werden. Wurde das Produkt über mehrere Jahre entwickelt, dann sollte jedes Jahr erwähnt
 werden.

 Wenn viele Autoren an einem Projekt arbeiten und auch noch verschiedene Lizenzen im Spiel sind
 (wie bei PEAR) ist es unter Umständen sinnvoll, folgende Version zu verwenden:

 Gültig
     /**
      * Crypt_Blowfish allows for encryption and decryption on the fly using
      * the Blowfish algorithm. Crypt_Blowfish does not require the mcrypt
      * PHP extension, it uses only PHP.
      * Crypt_Blowfish support encryption/decryption with or without a secret key.
      *
      *
      * PHP versions 4 and 5
      *
      * LICENSE: This source file is subject to version 3.0 of the PHP license
      * that is available through the world-wide-web at the following URI:
      * http://www.php.net/license/3_0.txt. If you did not receive a copy of
      * the PHP License and are unable to obtain it through the web, please
      * send a note to license@php.net so we can mail you a copy immediately.
      *
      * @category   Encryption
      * @package    Crypt_Blowfish
      * @author     Matthew Fonda 
      * @copyright 2005 Matthew Fonda
      * @license    http://www.php.net/license/3_0.txt PHP License 3.0
      * @version    CVS: $Id: Blowfish.php,v 1.81 2005/05/30 18:40:36 mfonda Exp $
      * @link       http://pear.php.net/package/Crypt_Blowfish
      */
Mittwoch, 15. Oktober 2008 - Copyright 2008                                          Seite: 12
by Claus van Beek
PHP Coding Standard

 Diesen Eintrag kann man mit Tools wie Javadoc, Doxygen oder phpDocumentor auswerten. Da sich
 die meisten Menschen zuerst mit einer Dokumentation auseinandersetzen, bevor sie den
 Source-Code durcharbeiten, ist eine API-Referenz oft hilfreich.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                       Seite: 13
by Claus van Beek
PHP Coding Standard

 7. Regel 4: Die Sprache für Kommentare und Bezeichner sollte Englisch sein

 Bezeichner von Variablen, Funktionen, Klassen und so weiter sollten in Englisch definiert werden.
 Alle Kommentare und Dokumentation sollte ebenfalls in Englisch erfolgen.

 Es ist absolut notwendig und unumgänglich Source-Code zu dokumentieren. Wenn keine
 zwingenden Gründe dagegen sprechen, sollten als Projektsprache Englisch genommen werden, um
 Personen aus anderen Ländern einen möglichst einfachen Zugang zum Projekt zu gewähren.
 Unbedingt zu vermeiden ist eine Mischung der englischen und der deutschen Sprache, gerade wenn
 es um die Benennung von Variablen geht. Siehe dazu auch mehr bei den Regeln zur Benennung von
 Variablen.

 Ein Team entscheidet sich dazu, Deutsch als Projektsprache zu nehmen. Damit entsteht nahezu
 automatisch das Problem der Sprachmischungen:

 Ungültig
     $select_maximum = 'SELECT MAX(id) FROM tabelle';
     $result_maximum = mysql_query($select_maximum);
     $eine_ganz_andere_variable = TRUE;

 Wie man unschwer sehen kann, muss man in einer deutschen Sprachumgebung auf Variablen wie

 •    $result
 •    $select
 •    $query
 •    $row

 verzichten und sich geeignete Äquivalente ausdenken. Auf Englisch als Projektsprache sollte nur
 verzichtet werden, wenn die Englischkenntnisse des Teams "im negativen Bereich" liegen oder der
 Fehlerquotient einen zweistelligen Wert hat.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                             Seite: 14
by Claus van Beek
PHP Coding Standard

 8. Regel 5: Jede Datei wird mit Änderungskommentaren und einem Zeitstempel versehen

 Wenn kein SVN oder CVS zur Verfügung steht, sollte das Team eine Konvention vereinbaren, wie es
 Änderungen am Source-Code dokumentiert. Zum Beispiel könnte man die Initialen jedes
 Teammitglieds verwenden plus das Datum nach dem ISO 8601 Standard.

 PHP
     // CVB 2006-05-23: Refactoring
     while ($row = mysql_fetch_assoc($result))
     (...)

 HTML
     
     (...)

 Es wird empfohlen fünf dieser Kommentare aufzubewahren, damit die letzten (Arbeits)Schritte
 nachvollzogen werden können. Ob die Kommentare im Kopf der Datei gemacht werden oder an der
 Stelle, wo die Änderungen gemacht werden, sollte das Team vor dem Projekt entscheiden und dann
 einheitlich für alle Dateien umsetzen.

 Ausnahme zu Regel 5: Es steht ein SVN oder CVS zur Verfügung. In diesem Fall sollte Gebrauch
 von den Funktionen dieser Software gemacht werden.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                         Seite: 15
by Claus van Beek
PHP Coding Standard

 9. Regel 6: Jede Funktion muss mit Kommentaren versehen werden

 Eine der wichtigsten Aufgaben der Programmierung liegt in der Dokumentation der Funktionen bzw.
 Methoden. Das ist in einem Team unverzichtbar, denn so können die anderen Team-Mitglieder alle
 Funktionen verstehen, verbessern und nutzen.

 Zitat von Jörg Krause ("PHP4 - Grundlagen und Profiwissen", Seite 95)
 Jedes Programm, auch das kleinste, sollte sauber kommentiert werden. Eine ordentliche
 Dokumentation erleichtert die Arbeit während der Entwicklung erheblich. Kommentare sind ein
 wesentlicher Bestandteil der Dokumentation. Stil und Inhalt sollten dem Programmierer die
 Übersicht in seinem Code erhalten, aber auch anderen mit dem Programm beschäftigten
 Personen die Lesbarkeit ermöglichen. Denken Sie daran, dass Ihre Überlegungen bei der
 Abstraktion eines Problems nicht immer ohne weiteres nachvollziehbar sind. Oft gibt es sehr viele
 Lösungen für eine Aufgabe. Warum Sie eine bestimmte Lösung gewählt haben und wie diese
 anzuwenden ist, wird in Kommentaren beschrieben.

 Ich kann die Worte von Jörg Krause nur unterstreichen. Hier lässt sich vortrefflich darüber streiten, ob
 es einen Unterschied macht, wenn die Berechnung einer Fakultät rekursiv oder iterativ gelöst wurde.
 Man sollte nicht lang und breit erklären, warum diesen oder jenen Ansatz gewählt hat. Wenn man
 jedoch eine komplizierte Operation, mit wenigen Befehlszeilen macht, muss das kommentiert werden.
 Lieber einen Kommentar zu viel, als einen zu wenig.

 Gültig
     /**
      * This function creates a RDBMS connection (mysql_connect) and
      * selects a database (mysql_select_db). Returns TRUE or FALSE.
      *
      * @param    string   $host: RDBMS/MySQL host, e.g. "localhost"
      * @param    string   $user: MySQL user, e.g. "mysql_user18"
      * @param    string   $password: MySQL password, e.g. "topsecret"
      * @param    string   $database: MySQL database, e.g. "mysql_database18"
      * @return boolean $connection_successfull: TRUE or FALSE
      */
     function connect_rdbms_select_database($host, $user, $password, $database)
     {
         $connect_rdbms = mysql_connect($host, $user, $password)
            or die('Could not connect to the MySQL RDBMS. Error: ' . mysql_error());
         $select_database = mysql_select_db($database)
            or die('Could not select the MySQL database. Error: ' . mysql_error());
         $connection_successfull = ($connect_rdbms and $select_database);
         return $connection_successfull; // returns TRUE or FALSE
     }

 Pro Zeile die Erklärung für einen Parameter. Diese Zeile sollte nach Möglichkeit alles über den
 Parameter aussagen. Extreme Programming hat zum Ziel, einen möglichst hohen Qualitätsstandard
 zu setzen. Diese Funktion zeigt sehr gut, wie das erreicht werden kann und wie eine Funktion
 dokumentiert sein sollte. Wichtig sind die Datentypen ("string", "boolean"), die Namen aller Parameter
 ("$host", "$user", "$password", "$database"), eine Beschreibung und ein Beispiel. Die Angabe des
 Wertebereichs ist optionial.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                                Seite: 16
by Claus van Beek
PHP Coding Standard

 Der Wertebereich bietet sich vor allem bei Integer-Parametern an, weil diese manchmal nur positiv
 verwendet werden, obwohl negative Werte auch denkbar sind. Dieses sollte aus einem Kommentar
 auf jeden Fall hervorgehen.
 Beispiel: "@param integer $total_entries: total entries in table 'users' (range: 1 to 65536), e.g. '257',
 '5864' and other unsigned values"
 Oder man gibt den den Datentypen aus MySQL an, wie TINYINT oder BIGINT. Sind negative Werte
 auch möglich, sollte auf jeden Fall ein Wertebereich angegeben werden und das Beispiel sollte eine
 negative und eine positive Zahl enthalten. Wie schon gesagt, die Zeile sollte nach Möglichkeit alles
 über den Parameter aussagen.

 Wie die Erklärungen "@return" und "@param" schon vermuten lassen, sollte man sich auch hier an
 den Standard von Javadoc, Doxygen oder dem phpDocumentor halten, damit man eine komplette
 API-Referenz erstellen kann.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                                   Seite: 17
by Claus van Beek
PHP Coding Standard

 10. Regel 7: Lange Kommentare sollten mit /* und kurze Kommentare mit // gemacht werden

 Das PEAR-Projekt dokumentiert sehr ausführlich auch einzelne Variablen:

 Gültig
     /**
      * Should data manipulation queries be committed automatically?
      * @var bool
      * @access private
      */
     var $autocommit = true;

 Man kann sich sehr leicht vorstellen, dass eine solche Verfahrensweise sehr viel Arbeit macht und es
 für jede Zeile auch übertrieben wäre. Systemkritische Variablen und Konstanten sollten aber auf
 diese Art und Weise dokumentiert werden.

 Gültig
     $boolean = ($i > $j);         // IF $i > $j: $boolean becomes TRUE or FALSE

 Denken Sie bei Kommentaren an die lesende Zielgruppe, aber ein wenig Fachwissen kann ruhig
 vorausgesetzt werden. Wenn also die Zeile
 $boolean = ($i > $j);
 in Ihrem Team jeder versteht, lassen Sie den Kommentar weg.

 Der C++ Coding Standard spricht von strategischen oder taktischen Kommentaren. Ein
 strategischer Kommentar beschreibt eine Funktion oder einen ganzen Absatz des Source-Codes. Ein
 strategischer Kommentar wird vor dem Code plaziert.
 Ein taktischer Kommentar beschreibt eine bestimmte Zeile und wird - wenn möglich - ans Ende der
 Zeile (also hinter dem Code) plaziert. Auch wenn der Kommentar ohne den Code nicht sinnvoll ist,
 sollte man einen taktischen Kommentar verwenden.

 Die Meinungen über die Art, die Menge und andere Faktoren der Dokumentation gehen stark
 auseinander. Die einen finden zu viele taktischen Kommentare unübersichtlich, die anderen denken,
 dass zwanzig Zeilen strategischer Kommentar für fünf Zeilen komplexen Source-Code gerade so
 ausreichend ist. Jedes Team muss also eine Entscheidung darüber fällen, in welchem Maße
 Kommentare angewendet werden.
 Das Prinzip der Einfachheit sollte immer Anwendung finden. Das erklärte Ziel jeder Dokumentation
 und jedes Kommentars muss Transparenz und Verständnis für den Source-Code sein.

 Zitat aus dem Film Philadelphia: "Bitte erklären sie mir das so, als ob ich sechs Jahre alt wäre!"
 Natürlich ist es unmöglich, dass ein 6-jähriger den komplexen Source-Code eines großen Projektes
 versteht, aber ich kann nicht oft genug betonen, dass Teamwork, Kommunikation, Verständnis und

Mittwoch, 15. Oktober 2008 - Copyright 2008                                                Seite: 18
by Claus van Beek
PHP Coding Standard

 Qualität des Source-Codes im Vordergrund jedes Projektes stehen müssen. Das Ziel von leicht
 verständlichem Source-Code ist erst erreicht, wenn jedes Mitglied des Teams, jedes Modul aus dem
 Stehgreif erklären kann.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                          Seite: 19
by Claus van Beek
PHP Coding Standard

 11. Regel 8: Alle Bezeichner werden aussagekräftig und eindeutig definiert

 In einem Programm können viele Bezeichner/Namen definiert werden. Jede Variable (Funktion,
 Konstante, etc.) braucht einen Bezeichner. Diese Bezeichner müssen aussagekräftig und eindeutig
 definiert werden. Sie sollten nicht zu lang sein, aber auch nicht so kurz, dass die Bedeutung der
 Variable unklar ist.

 In jedem (guten) Programmierkurs lernen Sie sprechende Variablen zu verwenden. Sprechende
 Variablen sagen etwas über den Inhalt und die Verwendung aus. Bezeichner aussagekräftig zu
 definieren ist dafür eine globale Umschreibung.

 Zitat aus "Einführung in Perl" von Randal L. Schwartz, Tom Phoenix und brian d foy, Seite 30
 In der Regel sollten Sie Variablennamen so wählen, dass sie etwas über den Zweck der Variablen
 aussagen. $r ist wahrscheinlich nicht so aussagekräftig wie $zeilen_laenge. (...) Ebenso können
 richtig platzierte Unterstriche das Lesen und Verstehen eines Variablennamens erleichtern,
 besonders dann, wenn der Programmierer, der Ihre Programme pflegen soll, einen anderen
 sprachlichen Hintergrund hat als Sie.

 Beispiel: Sie programmieren Auswertungen (englisch: reports) über den Zugriff auf einen
 Bankautomat. Dazu benutzen Sie in Ihrer Funktion die PHP-Funktionen mysql_query und
 mysql_num_rows. Sie könnten die Funktion "rep_mq_mnr()" nennen. Das steht für
 "report_mysql_query_mysql_num_rows". Ein sehr schlechter Name für die Funktion.

 1.   Keine Abkürzungen verwenden, die niemand kennt.
 2.   Beide Versionen des Namens sagen nichts über die Funktionalität, den Sinn und Zweck und die
      Arbeitsweise der Funktion aus.

 Erzeugt die Funktion Grafiken? Dann wäre der Name "create_graphics()" sinnvoll. Oder das Ergebnis
 von "mysql_num_rows()" enthält alle Bankautomat-Logins des heutigen Tages, dann wäre
 "check_all_logins_for_today()" oder auch "get_logins_today()" eine gültige Bezeichnung. Die zweite
 Variante könnte schon wieder unklar sein, denn die Übersetzung könnte auch lauten: "Hole dir heute
 die Logins."

 Einen Namen eindeutig zu vergeben bedeutet zum Beispiel:

 •    Zwei Funktionen nicht nur durch Groß- und Kleinschreibung zu unterscheiden, also nicht
      Funktion A "get_data()" und Funktion B "Get_data()".
 •    Variablen nicht durchnummerieren, also nicht "$var1", "$var2", etc.
 •    Zahlen in Namen vermeiden, also eine Konstante nicht in einem Skript mit "I0" (I + Ziffer "0") und
      dann im nächsten mit "IO" (I + Buchstabe "O") definieren.

 Ob man die Abkürzung "IO" für "Input/Output" als bekannt voraussetzen kann, muss im Zweifelsfall
 das Team entscheiden - zu Abkürzungen später mehr.

 Erneut kann ich einen Fall aus der Praxis erzählen. Ein Kollege von mir definierte die Funktion "a()".
 Diese Funktion gab mit echo die Zeichen "\n" aus. Warum? Er war zu faul das immer wieder zu
 tippen. Wie aussagekräftig ist der Name "a()" wohl für einen anderen Programmierer?
Mittwoch, 15. Oktober 2008 - Copyright 2008                                               Seite: 20
by Claus van Beek
PHP Coding Standard

Mittwoch, 15. Oktober 2008 - Copyright 2008   Seite: 21
by Claus van Beek
PHP Coding Standard

 12. Regel 9: Benennung von Variablen und Funktionen erfolgen mit Unterstrich und in
 Kleinbuchstaben

 Wie schon erwähnt ist der Einsatz von Abkürzungen mit Vorsicht zu genießen. Es kann begründete
 Fälle geben, wo es sinnvoll ist, eine Abkürzung zu verwenden, aber die Regel "Benennung von
 Variablen und Funktionen erfolgen mit Unterstrich und in Kleinbuchstaben" soll den Einsatz von
 Abkürzungen zusätzlich erschweren. Das ist Absicht, denn Abkürzungen können einem
 Programmier-Team das Leben schwer machen - dazu später mehr.

 Zitat aus "Einführung in Perl" von Randal L. Schwartz, Tom Phoenix und brian d foy, Seite 30
 Ebenso können richtig platzierte Unterstriche das Lesen und Verstehen eines Variablennamens
 erleichtern, besonders dann, wenn der Programmierer, der Ihre Programme pflegen soll, einen
 anderen sprachlichen Hintergrund hat als Sie. So ist beispielsweise der Name $flachbett_scanner
 besser geeignet als $flachbettscanner, da sich Letzteres auch durchaus als $flach_bettscanner
 deuten lassen könnte. Bedeutet $stopid nun $sto_pid (»store process ID«, also Prozess-ID
 speichern), oder $stop_id (die ID für irgendetwas, das gestoppt werden soll), oder handelt es sich
 bloß um einen stupiden Rechtschreibfehler?

 Um den Einsatz von Abkürzungen trotzdem zu ermöglichen und Variablen eindeutig und mit
 mehreren Worten benennen zu können, benutzt man den Unterstrich zur Trennung der Wörter:

 Gültig
     $surname_given_name = 'van Beek, Claus';
     $connect_rdbms = mysql_connect();

 Kleinbuchstaben erleichtern die Suche nach Variablen. Einige Editoren und die meisten
 Linux-Systeme unterscheiden zwischen Groß- und Kleinschreibung. Sie arbeiten case-sensitive. Ein

 grep "*skript_name*" ein_skript.php

 führt dann auf jeder Plattform zum Erfolg (wenn es eine entsprechende Variable gibt). Heißt die
 Variable "$Skript_Name", wird der oben genannte Befehl fehlschlagen.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                              Seite: 22
by Claus van Beek
PHP Coding Standard

 13. Regel 10: Konstanten werden in Großbuchstaben defniert

 Für Konstanten gelten die gleichen Regeln wie für andere Bezeichner. Eine Ausnahme gibt es
 jedoch: Alle Konstanten werden groß geschrieben, so wie es bei php.net (Konstanten) auch
 vorgeschlagen wird. Gute Bezeichner für Konstanten sind:

 •    START_VALUE
 •    DATABASE_PREFIX
 •    ENCRYPTION

 und so weiter.

 Gültig
     // constants for database connection
     define('HOST', 'localhost');
     define('USER', 'root');
     define('PASSWORD', 'your_password');
     define('DATABASE', 'your_database_name');

 Das Beispiel zeigt den richtigen Gebrauch Konstanten. Viele Konfigurationsdateien verwenden
 Variablen. Allerdings ändert sich die Konfiguration für ein RDBMS nicht im laufenden Betrieb, also
 sollten auch keine Variablen verwendet werden. Konstanten sind hier die bessere Wahl.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                              Seite: 23
by Claus van Beek
PHP Coding Standard

 14. Regel 11: Auf keinen Fall Abkürzungen verwenden, die zweideutig sein können

 Stellen Sie sich vor, Sie finden in einem PHP-Skript die Variable "$back". Man könnte jetzt
 annehmen, dass diese Variable etwas mit "Zurück" zu tun hat. Mir ist allerdings ein Fall bekannt, wo
 "back" eine Abkürzung für "Backend" war. Im gleichen Projekt wurde auch die Abkürzung "lan" für
 "language" verwendet. "LAN" ist jedoch (weltweit) eine Abkürzung für "Local Area Network".

 Wenn auch nur ein Mitglied im Team über so etwas "stolpert", geht wertvolle Zeit verloren. Das muss
 unter allen Umständen vermieden werden. Das man "back" schneller getippt hat als "backend" ist
 natürlich wahr, aber aus solcher Faulheit - und wir reden hier von vielleicht zwei Sekunden
 Mehraufwand - können sich fatale Folgen ergeben:

 •    Ein Team-Mitglied versucht mehrere Stunden herauszubekommen, warum in den Tabellen, die
      mit "lan" beginnen, keine Spalten vorhanden sind, die Informationen über Netzwerke (LAN) oder
      IP-Adressen enthalten.
 •    Eine Person denkt darüber nach ein AddOn oder Plugin für eine GPL-Software zu schreiben.
      Aufgrund der schlechten Strukturen in der Datenbank und im Source-Code entscheidet er sich
      jedoch dagegen und macht sich auf die Suche nach einem anderen, vergleichbaren
      GPL-Produkt.
 •    In einer Besprechung wird ein Bug in der Software entdeckt. Aufgrund von fehlender
      Dokumentation und vielen Abkürzungen, die selbst von den Programmierern nicht mehr
      entschlüsselt werden können, wird die Suche nach dem Bug deutlich erschwert.

 Diese Fälle sind nicht konstruiert, sondern meine Erfahrungen oder die Berichte von Freunden. Um
 solche Probleme zu umgehen:

 •   verwenden Sie so wenig Abkürzungen wie möglich
 •   nur Abkürzungen benutzen, die jeder im Team kennt
 •   auf keinen Fall Abkürzungen verwenden, die zweideutig sein können
 Abkürzungen vermeiden
     $group_id = 1;               // instead of $grpid
     $name_length = 20;           // instead of $namLn
     $reset_printer = TRUE;       // instead of $rstprt

 Obwohl "group_id" nahezu genauso schnell getippt ist, wie "grpid" werden in vielen PHP-Projekten
 solche kryptischen Abkürzungen benutzt. Es wäre auch möglich, die Variable "grpid" als "grPID" zu
 interpretieren. "PID" ist unter Linux/Unix eine bekannte Abkürzung für "Process ID". In genau diesem
 Fall würde unweigerlich das Rätsel um die Abkürzung "gr" beginnen.

 Mehrere Bedeutungen sind möglich
     $tp = termProcess(); // Terminate process or terminal process?
     $stupid = $rst; // Typo? "$stupid" or "$stop_id"?; $rst == $result or $reset?
     $success = proc(); // "proc()" == processing or procedure?

 Abkürzungen wie "RDBMS" können schnell über Google gefunden werden und sind den meisten
 Personen in der EDV bekannt. Sie können deswegen mit Vorsicht eingesetzt werden. Warum mit
Mittwoch, 15. Oktober 2008 - Copyright 2008                                              Seite: 24
by Claus van Beek
PHP Coding Standard

 Vorsicht? Die Pflicht zur Kleinschreibung macht es noch schwieriger Abkürzungen zu erkennen und
 richtig zu deuten. Abkürzungen wie "cp" für "copy" dürfen niemals verwendet werden, weil der
 Aufwand vier anstatt zwei Zeichen zu tippen nahezu identisch ist.

 Nehmen wir an, Sie haben die Möglichkeit eine Variable "$terminal_process" oder "$tp" zu nennen.
 Sie sollten immer die ausführliche Variante wählen, weil Sie mit

 •    Suchen & Ersetzen oder mit
 •    Copy & Paste

 solche Variablen nicht immer wieder tippen müssen.

 "$x" wird bei mathematischen Programmen und Funktionen verwendet. Das sollte allerdings nur
 gemacht werden, wenn alle im Team mathematische Kenntnisse haben. Der Variablenname
 "$extract_a_root" ("to extract a root" = "eine Wurzel ziehen") ist zwar nicht so kurz, aber viel
 sprechender als "$x". Der Bezeichner "$root" wäre hier wieder verwirrend, weil die Variable auch
 etwas mit dem Root-Account unter Linux zu tun haben könnte.

 Einige Programmierer benutzen Variablen wie "$blnResult" oder "$strName", um den Typ einer
 Variable zu kennzeichnen. Das ist keine gute Idee, weil einige dieser Abkürzungen einem
 Programmierneuling nicht bekannt sind und selbst Google und das Wikipedia dazu keine direkten
 Treffer liefern. "str" ist unter anderem eine Abkürzung für "Straße" oder den Flughafen von Stuttgart.
 "bln" liefert noch verwirrendere Ergebnisse. Trotzdem werden Abkürzungen sehr häufig von
 Programmierern verwendet.

 Aus Erfahrung weiß ich, dass Programmierer, die sehr intensiv Abkürzungen verwenden, sich nach
 mehreren Monaten selbst in ihren Source-Code einarbeiten müssen. Immer wieder tauchen Fragen
 auf: "Dieses '$tp' ... was habe ich mir vor einem Jahr dabei gedacht?". Der PHP Coding Standard
 sollte das Maß dieser Einarbeitung auf ein Minimum reduzieren.

 Ausnahme zu Regel 11: Zählvariablen in Schleifen werden in der Regel mit einem Buchstaben ("$i",
 "$j", "$k" und so weiter) definiert. Auch Abkürzungen, die in einem Team gebräuchlich sind, können
 mit Vorsicht eingesetzt werden.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                               Seite: 25
by Claus van Beek
PHP Coding Standard

 15. Regel 12: Funktionen, Parameter und Rückgabewerte gut dokumentieren

 Funktionen sollten immer einen Rückgabewert (Return-Parameter) haben. Falls Ihre Funktion
 ausschließlich zur Verarbeitung oder zur Ausgabe gedacht ist, sollte die Funktion trotzdem TRUE
 oder FALSE zurückliefern. Dieses ist dann ein Indikator dafür, ob die Funktion erfolgreich oder nicht
 erfolgreich gearbeitet hat.

 Wie schon erwähnt müssen Funktionen plus Parameter gut dokumentiert und beschrieben werden.
 Das gilt auch für die Rückgabewerte. Bezeichner und Parameter müssen "sprechend" und
 aussagekräftig definiert werden.

 Ungültig
     function con($h, $u, $p, $d)
     {
        // do something
     }

 Funktionsname: Der Name/Bezeichner einer Funktionen sollte nach Möglichkeit ein Verb enthalten
 und genau beschreiben, was die Funktion macht. Ein Bezeichner sollte eher zu lang sein, als zu kurz.
 Aber "print_login_status_for_a_given_user()" würde zu weit gehen. Die Funktion sollte besser
 "print_user_login_status()" oder nur "print_login_status()" heißen.

 Parameter einer Funktion: Parameter unterliegen denselben Richtlinien wie alle anderen
 Bezeichner. Funktionen, die alle "do($a, $b, $c)" heißen und ebenso kryptische Parameter enthalten,
 widersprechen dem Coding Standard. Wenn man eine Funktion nur anhand ihres Names und anhand
 der Parameter benutzen kann, ist das für jeden anderen Programmierer im Team eine Hilfe.

 Gültig
     function connect_rdbms_select_database($host, $user, $password, $database)
     {
        $connect_rdbms = mysql_connect($host, $user, $password);
        $select_database = mysql_select_db($database);
        $connection = ($connect_rdbms and $select_database);
        return $connection;
     }

 In dieser Version kann man sich schon anhand der ersten Zeile viel besser vorstellen, was die
 Funktion macht. Die Funktion wird TRUE zurückliefern, wenn sowohl die Verbindung zum RDBMS,
 als auch zur Datenbank erfolgreich ist.

 Zitat aus dem Wikipedia: Extreme Programming
 Ein weiterer wichtiger Punkt ist die hohe Qualität, die gemäß [Extreme Programming] im
 Gegensatz zu anderen Faktoren wie Ressourcen, Funktionsumfang oder Endtermin nicht
 diskutabel ist. Hiermit unterscheidet sich diese Grundeinstellung von vielen anderen Methoden der
 Softwareerstellung, bei denen Software zu einem bestimmten Zeitpunkt und in einem definierten
 Funktionsumfang fertiggestellt werden soll, worunter fast immer die Softwarequalität leidet.
Mittwoch, 15. Oktober 2008 - Copyright 2008                                               Seite: 26
by Claus van Beek
PHP Coding Standard

 Gerade die Qualität ist allerdings sehr wichtig, um das Produkt einsatzfähig, fehlerfrei und
 erweiterbar zu halten. Software mit gutem Design, hoher Qualität ist mittelfristig kostengünstiger,
 erweiterbarer und weniger fehlerbehaftet als schnell erstellte sogenannte Frickelsoftware.

 Zusammenfassung: Qualität und Klarheit des Codes sollten nicht durch Faulheit verhindert werden.
 Im Gegenteil, es müssen Grundsäulen des Programmierens sein. "Weg von Frickelsoftware und
 schlechten Strukturen!" sollte das Motto sein. Nicht nur neue Features sollten im Vordergrund eines
 Projektes stehen, sondern auch die Qualität von Source-Code und das Prinzip der Einfachheit.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                                Seite: 27
by Claus van Beek
PHP Coding Standard

 16. Regel 13: Die Klammern für eine Funktion () stehen direkt am Funktionsnamen

 Das die Klammern für eine Funktion () stehen direkt am Funktionsnamen stehen, ist ein sehr
 verbreiteter Standard. Wie die Parameter einer Funktion behandelt werden, ist nicht einheitlich
 geregelt. Es wird empfohlen der Vorgabe von php.net zu entsprechen und Parameter ohne
 Leerzeichen zu notieren, mit Ausnahme der Kommata. Der Funktionsaufruf "add(5,2)" könnte von
 einem unerfahrenen Programmier falsch interpretiert werden. Hier werden zwei Parameter
 übergeben, nicht eine Dezimalzahl, die in PHP mit "5.2" notiert werden würde. Auch deswegen und
 aus Gründen der Übersichtlichkeit wird nach dem Komma ein Leerzeichen eingefügt, so wie es im
 deutschen Schriftverkehr auch üblich ist.

 Gültig
     // constants for database connection
     define('HOST', 'localhost');
     define('USER', 'root');
     define('PASSWORD', 'your_password');
     define('DATABASE', 'your_database_name');
     // connect the RDBMS and select database
     mysql_connect(HOST, USER, PASSWORD);
     $error = mysql_select_db(DATABASE);

 Viele Skripte nutzen Variablen für die Festlegung von Verbindungsparametern. Konstanten haben
 den Vorteil, dass sie in Funktionen benutzt werden können. Außerdem ist es für Angreifer unmöglich,
 die Konstanten zu überschreiben.

 Ungültig
     get_user_data( $username, $password ); // incorrect: spaces next to brackets
     get_user_data($username,$password); // incorrect: no space between arguments
     get_user_data($a, $b); // ambiguous: what do variables $a and $b hold?

 Die beiden Code-Blöcke zeigen einmal die richtige und die falsche Verwendung von Parametern und
 Klammern. Ein weiterer Vorteil bei der Verwendung der richtigen Klammern ist das einfache Suchen
 nach einer bestimmten Funktion. Es ist denkbar, dass "define" auch in den Kommentaren steht. Eine
 Suche nach "define(" sollte in der Regel nur die Funktion zurückliefern.

 Ausnahme zu Regel 12: Funktionen mit langen oder vielen Parametern; siehe dazu die nächste
 Regel. Wie Klammern gesetzt werden, ist unter Programmierern eine der größten Debatten aller
 Zeiten. Wenn sich das Team auf einen anderen Standard einigt, sollte dieser befolgt werden.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                            Seite: 28
by Claus van Beek
PHP Coding Standard

 17. Regel 14: Funktionen mit langen oder vielen Parametern müssen übersichtlich notiert
 werden

 Dies ist die Erweiterung zu Regel 12. Es wird oft notwendig sein, Funktionen mit vielen Parametern
 zu benutzen und/oder lange Variablennamen zu definieren. Der Befehl mktime() enthält sechs
 Parameter.

 Gültig
     $date_strftime = strftime(
        '%a, %d. %b %Y',
        mktime(
           0,
           0,
           0,
           $row['month'],
           $row['day'],
           $row['year']
        )
     );

 Auf den ersten Blick ist so eine verschachtelte Struktur und die Anwendung einer Funktion mit vielen
 Parametern sichtbar. Auch das die Funktion sechs Parameter hat ist über die Verteilung auf mehrere
 Zeilen besser ersichtlich.

 Ungültig
     $date_strftime = strftime('%a, %d. %b %Y',mktime(0,0,0,$row['month'],
     $row['day'],$row['year']));

 Natürlich ist dieser Code kompakter, aber neben den Problemen, die Parameter zu identifizieren, ist
 die Klammersetzung undeutlich. Da hier nur das Datum formatiert werden soll, gilt es über eine
 eigene Funktion nachzudenken, die zum Beispiel mit "date_strftime($row['month'], $row['day'],
 $row['year'])" aufgerufen wird. Damit würde man den Code dann wieder auf eine Zeile reduzieren.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                             Seite: 29
by Claus van Beek
PHP Coding Standard

 18. Regel 15: Der Code muss vom Design getrennt werden (Template Engine)

 Code und Design zu trennen ist eine der wichtigsten Regeln. Klassen und Funktionen unterstützen
 Sie darin modular zu programmieren. Wenn Sie jedoch HTML und PHP mischen, behindern Sie sich
 bei diesem Ansatz und ihre Skripte werden automatisch unübersichtlich. Es gibt ganz einfache
 Maßnahmen, wie man nur mit PHP eine Template Engine abbilden kann, ohne sich in vibTemplate
 oder Smarty einzuarbeiten.

 Zitat von Jörg Krause ("PHP5 - Grundlagen und Profiwissen", Seite 36 und 37)
 Trennen Sie Code vom Design
 Die Trennung hilft, leicht beherrschbare Programmteile zu erhalten. Die Wiederverwendbarkeit
 des Codes wird gesteigert. Sie können mit Gestaltungswerkzeugen arbeiten, die
 eingeschlossenen Code nicht verstehen. In großen Teams können Sie das Design von Designern
 erledigen lassen und die reine Programmierarbeit Programmierern übergeben.

 Zur Wiederverwendbarkeit von Design und Code
 Wenn Sie etwas ändern möchten, müssen Sie es nur an einer Stelle tun. Konsistente
 Gestaltungsmerkmale und Bedienerführung erleichtern den Nutzern die Navigation. Behandeln
 Sie Design-Elemente als Komponenten, die Sie immer wieder verwenden.

 Sie werden auch im Nachfolger "PHP5 - Grundlagen und Profiwissen" Textpassagen über Template
 Engines und die Trennung von Code und Design finden. Jörg Krause stellt hier wichtige Prinzipien
 der PHP-Programmierung vor:

 •    Arbeiten im Team
 •    Module bzw. modulares Programmieren
 •    Wiederverwendbarkeit

 Mit einer Template Engine sind Sie viel besser in der Lage, diesen Dingen und dem PHP Coding
 Standard entgegen zu kommen. Es ist ein unverzichtbarer Teil der PHP-Programmierung. Viele der
 mir bekannten großen Projekte trennen PHP und HTML, aber nicht alle setzen dafür eine Template
 Engine ein. Projekte wie das IPB lagern den HTML-Code in Funktionen aus, die dann über mehr oder
 weniger eindeutige Skript-Namen gefunden werden können. Ich empfehle jedoch den Einsatz einer
 Template Engine:

 1.   Template Engine nur mit PHP
 2.   vLIB: vlibTemplate, vlibDate und vlibMimeMail
 3.   Smarty

 Sie sollten sich vorher in Ihrem Team überlegen, welche Template Engine sie einsetzen wollen. Ich
 empfehle vLIB oder die "Template Engine nur mit PHP". Allerdings ist der Einsatz von Template
 Engines umstritten: Warum Template Engines nicht glücklich machen.

 Zitat von Jörg Krause ("PHP4 - Grundlagen und Profiwissen", Seite 193)
 Die saubere Trennung von HTML-Code und Skript ist für die Lesbarkeit des Quelltextes ebenfalls
 wichtig. Bei komplexen Anwendungen entsteht schnell ein Durcheinander von Befehlen, die auch
 geübten Programmierern jede Chance nehmen, eine Funktion zu erkennen oder einen Fehler zu
 finden.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                            Seite: 30
by Claus van Beek
PHP Coding Standard

 Ich kann nicht oft genug betonen, wie wichtig sauberer und übersichtlicher Source-Code ist. Eine
 Template Engine wird für jede professionelle PHP-Applikation empfohlen. Template Engines sollten
 allerdings nicht eingesetzt werden, wenn mehrere Ausgabeformate erzeugt werden müssen. Beispiel:
 Datensätze aus MySQL sollen als Bild (GIF, PNG), HTML, Flash und PDF dargestellt werden
 können, dieses kann eine Template Engine nicht, weil sie nur Text (reiner Text, HTML, CSS, XML,
 LaTex, etc.) erzeugen kann.

 Einige Programmierer sagen, dass MVC (Model View Controller) bevorzugt eingesetzt werden sollte.
 Ich bin eher dafür, den "View" mit einer Template Engine zu unterstützen, wenn die Ausgabe der
 Daten in HTML oder XML erfolgen soll.

Mittwoch, 15. Oktober 2008 - Copyright 2008                                          Seite: 31
by Claus van Beek
Sie können auch lesen