Deutsch:Coding guidelines/code layout

(Version 1.22)

=Code Layout/Guidelines=

Bitte denken sie daran, das diese Richtlinien auf alle php, html, javascript und css Dateien angewendet werden sollen

Variablen-/Funktions-Namensgebung
Wir werden keine Form der ungarischen Notation verwenden. Viele von uns glauben das diese Notation eine der verworrensten Techniken die benutzt wird ist.

Variablen Namen:

Variablennamen sollten komplett kleingeschrieben werden, die Wörter durch den Unterstrich getrennt, Beispiel:


 * $current_user ist richtig, aber $currentuser und $currentUser sind es nicht

Namen sollten beschreibend, aber knapp sein. Wir wollen keine langen Sätze als Variablennamen, aber ein paar Buchstaben extra sind immer besser als sich zu fragen wofür die Variable denn nun verwendet wird.

Schleifen-Zähl-Variablen:

Die einzige Situation wo Variablen aus einem Buchstaben bestehen dürfen sind die Schleifen-Variablen. In diesem Fall sollte die Variable der äußerten Schleife immer $i sein. Wenn Schleifen innerhalb der Schleife sind, sollten deren Variablen $j, gefolgt von $k und so weiter sein. Wenn die Schleifenvariablen schon aussagekräftig sind, sollte diese Regel nicht angewendet werden, Beispiel:

for ($i = 0; $i < $outer_size; $i++) {  for ($j = 0; $j < $inner_size; $j++) {     foo($i, $j); } }

Funktionsnamen:

Funktionsnamen sollten beschreibend sein. Wir programmieren ja kein C hier, wir wollen keine Funktionen schreiben die "stristr" heißen. Wieder gilt: Kleinschreibung und Unterstriche als Trennung zwischen den Worten. Funktionen sollten ein Verb im Namen haben. Gute Funktionsnamen sind zum Beispiel print_login_status, get_user_data, usw.

Funktionsparameter:

Parameter sind Bestandteil derselben Richtlinien wie Variablennamen. Wir wollten keine Parameter wie do_stuff($a, $b, $c). In den meisten Fällen wollen wir in der Lage sein, zu wissen wie eine Funktion benutzt wird, indem wir auf die Funktionsdeklaration schauen.

Zusammenfassung:

Die grundlegende Philosophie hier ist die Lesbarkeit des Codes nicht zugunsten der Faulheit zu beeinträchtigen. Dies muss mit dem gesunden Menschenverstand gemacht werden, aber; print_login_status_for_a_given_user ist zu lang, als Beispiel -- diese Funktion sollte besser print_user_login_status', oder einfach print_login_status'' heißen.

Spezielle Namen:

Für alle Emotions/Smilies gilt der Ausdruck smiley im Singular und smilies im Plural.

Code Layout
Immer geschweifte Klammern benutzen:

Dies ist ein anderes Beispiel für die Faulheit zwei extra Zeichen einzugeben, die die Code Lesbarkeit nicht vereinfachen. Selbst in dem Teil von manchen Abschnitten in den nur eine Zeile lang ist, vergesst die geschweiften Klammern nicht. Denkt einfach dran, Beispiel

// These are all wrong.

if (Bedingung) do_stuff;

if (Bedingung) do_stuff;

while (Bedingung) do_stuff;

for ($i = 0; $i < size; $i++) do_stuff($i);

// These are all right.

if (Bedingung) {	do_stuff; }

while (Bedingung) {	do_stuff; }

for ($i = 0; $i < size; $i++) {	do_stuff; }

Wo die geschweiften Klammern hingehören:

Um diese Frage wird häufig gestritten, wir haben es einfach gehalten: Geschweifte Klammern in ihre eigene Zeile, die schließende Klammer dazu sollte immer genau so weit eingerückt sein, Beispiel:

if (Bedingung) {	while (Bedingung2) {		...	} } else {	... }

for ($i = 0; $i < $size; $i++) {	... } while (Bedingung) {	... } function do_stuff {	... }

Benutzen Sie Leerzeichen zwischen den Ausdrücken/Tokens:

Dies ist ein weiterer, einfacher Schritt um Code ohne große Mühe lesbarer zu halten. Wann auch immer Sie eine Zuweisung, einen Ausdruck, oder ähnliches benutzen... Lassen sie immer ein Leerzeichen zwischen den Tokens. Schreiben Sie den Code immer so als wäre es die Englische(Deutsche) Sprache. Setzen sie Leerzeichen zwischen Namen und Operanden. Benutzen Sie keine Leerzeichen nach öffnenden oder vor schließenden Klammern. Setzen sie keine Leerzeichen vor ein Komma oder Semikolon. Dies kann man am besten an ein paar Beispielen zeigen.

// Jedes Paar zeigt erst die falsche, dann die richtige Schreibweise.''

$i=0; $i = 0; if($i<7) ... if ($i < 7) ... if ( ($i < 7)&&($j > 8) ) ... if ($i < 7 && $j > 8) ... do_stuff( $i, 'foo', $b ); do_stuff($i, 'foo', $b); for($i=0; $i<$size; $i++) ... for ($i = 0; $i < $size; $i++) ... $i=($j < $size)?0:1; $i = ($j < $size) ? 0 : 1;

Operatoren Rangfolge:

Kennen Sie die exakte Rangfolge der Operatoren in PHP? Vermutlich genauso wenig wie ich. Raten Sie nicht. Machen sie es immer mit Klammern deutlich, wie die Reihenfolge aussieht, so dass sie wissen was passiert. Denken Sie daran es nicht zu übertreiben, da es die Lesbarkeit erschweren kann. Grundsätzlich sollten sie nicht jeden einzelnen Ausdruck in Klammern setzen. Beispiel:

// Was ist das Ergebnis? Wer weiß das schon... $bool = ($i < 7 && $j > 8 || $k == 4);

// Jetzt können Sie sicher sein, was ich hier mache $bool = (($i < 7) && (($j < 8) || ($k == 4)));

// Aber das hier ist noch besser, weil es noch lesbarer ist und trotzdem ist es klar was passiert. $bool = ($i < 7 && ($j < 8 || $k == 4));

Strings im Quellcode:

Es gibt 2 verschiedene Wege in PHP Strings zu schreiben - entweder mit einfachen oder doppelten Anführungszeichen. Der Hauptunterschied ist, das der Parser Variablen innerhalb eines Strings mit doppeltem Anführungszeichen ersetzt, bei einfachen Anführungszeichen nicht. Aufgrund dieser Tatsache sollten Sie immer die einfachen Anführungszeichen bevorzugen, wenn sie nicht unbedingt eine Variable innerhalb des Strings verwenden wollen. Mit dieser Methode ersparen wir dem Parser die Arbeit jeden String nach Variablen zu durchsuchen.

Auch wenn sie eine Variable als Teil eines Funktionsaufrufes ist, sollten sie doppelte Anführungszeichen vermeiden. Beachten Sie, das fast alle Maskierungs-/Escape-Verfahren die für doppelte Anführungszeichen existieren nicht mit einfachen Anführungszeichen funktionieren. Seien Sie vorsichtig, und betrachten Sie dieses als Regeln die sie brechen dürfen, wenn die Lesbarkeit des Codes dadurch gefördert wird. Beispiel:

// falsch $str = "";

do_stuff("$str");

// richtig $str = 'Dies ist ein wirklich langer String ohne Variablen die der Parser finden könnte.';

do_stuff($str);

// Manchmal sind einfache Anführungszeichen aber einfach nicht richtig $post_url = $phpbb_root_path. 'posting.'. $phpEx. '?mode='. $mode. '&amp;start='. $start;

// Manchmal braucht man doppelte Anführungszeichen um die Zeilen nicht zu sehr mit String-Verknüpfungen zu überladen $post_url = "{$phpbb_root_path}posting.$phpEx?mode=$mode&amp;start=$start";

Bei SQL Anweisungen ist das mischen von einfachen und doppelten Anführungszeichen teilweise erlaubt (Näheres finden Sie in den Richtlinien für die SQL-Formatierungshinweisen), oder es sollte versucht werden nur eine Methode zu nutzen - wenn möglich einfache Anführungszeichen.

Assoziative Array Schlüssel:

In PHP ist es möglich Strings als Schlüssel von assoziativen Arrays ohne Anführungszeichen zu verwenden. Wir wollen das nicht machen -- die Strings sollten immer in Anführungszeichen um Verwirrungen zu vermeiden. Beachten sie das dies nur gilt wenn ausgeschriebene Strings verwendet werden, Beispiel:

// falsch $foo = $assoc_array[blah];

// richtig $foo = $assoc_array['blah'];

// falsch $foo = $assoc_array["$var"];

// richtig $foo = $assoc_array[$var];

Kommentare:

Jeder komplexen Funktion sollte ein Kommentar vorhergehen die dem Programmierer alles erklärt was er braucht um zu wissen wie die Funktion funktioniert. Die Bedeutung jedes Parameters, die erwarteten Werte, und die Rückgabe Werte sind minimale Voraussetzung. Das Verhalten der Funktion in Fehlerfällen (und welche Bedingungen dafür nötig sind) sollte genauso vorhanden sein - aber meist zusammen mit den Rückgabewerten.

Besonders wichtig zu kommentieren sind alle Voraussetzungen die der Code macht, oder Vorbedingungen für die einwandfreie Ausführung. Jeder Entwickler sollte in der Lage sein, jeden Teil der Anwendung anzusehen und in einem angemessenen Zeitraum zu verstehen was in ihm vorgeht.

Vermeiden sie die Verwendung von /* */ Kommentarblöcken für Einzeiler, // sollten für ein/zweizeilige Kommentare verwendet werden.

Magische Nummern:

Benutzen Sie diese nicht. Benutzen Sie Konstanten für alle bestimmten Zeichen, außer wenn der Sinn offensichtlich ist. Grundsätzlich ist es möglich mit der 0 abzufragen ob ein Array 0 Elemente hat. Es ist aber nicht erlaubt Zahlen besondere Bedeutungen zu geben, wenn sie als Zeichen verwendet werden. Dies stört die Lesbarkeit und die Wartbarkeit. Die Konstanten true und false sollten anstelle von 1 und 0 verwendet werden -- auch wenn sie die gleichen Inhalte haben (nicht aber den Typ!), denn mit Konstanten ist es offensichtlich was der Code macht. Wenn nötig casten Sie die Variablen, vertrauen Sie nicht auf den Typ (PHP nimmt es da nicht so genau, was zu Sicherheitsproblemen führen kann wenn der Entwickler nicht sehr genau drauf achtet).

Verkürzte Operatoren:

Der einzige verkürzte Operator der die Lesbarkeit nicht einschränkt, sind das Inkrement $i++ und Dekrement $j--. Diese Operatoren sollten aber nicht als Teil eines Ausdruckes sein. Sie sollten, wann immer möglich in eine eigene Zeile geschrieben werden. Sie innerhalb eines Ausdruckes zu benutzen ist die Kopfschmerzen beim Debuggen nicht wert, Beispiel:

// falsch $array[++$i] = $j; $array[$i++] = $k;

// richtig $i++; $array[$i] = $j;

$array[$i] = $k; $i++;

Alternative Kontrollstrukturen:

Alternative Kontrollstrukturen sollten nur bei sehr einfachen Anweisungen verwendet werden. Insbesondere wenn sie für Zuweisungen, und nicht für Funktionsaufrufe oder andere komplexe Anweisungen, genutzt werden. Sie können sich bei falscher Anwendung nachteilig für die Lesbarkeit auswirken, also verwenden Sie diese nicht um ein paar Zeichen einzusparen, Beispiel:

// Schlechte Anwendung ($i < $size && $j > $size) ? do_stuff($foo) : do_stuff($bar);

// Gute Anwendungsbeispiele $min = ($i < $j) ? $i : $j;

Verwenden Sie keine nicht initialisierten Variablen.

Für phpBB3 versuchen wir einen höheren Level von Laufzeitfehlern zu erreichen. Das bedeutet dass das Verwenden von nicht initialisierten Variablen eine Warnung hervorrufen wird. Diese Warnungen können durch die eingebaute Funktion isset umgangen werden - aber sie sollten besser immer existieren. Um zu prüfen ob ein Array einen Schlüssel hat kann geschickt sein, Beispiel:

// Falsch if ($forum) ...

// Richtig if (isset($forum)) ...

// genauso möglich if (isset($forum) && $forum == 5)

Die Funktion empty ist praktisch wenn Sie überprüfen wollen ob eine Variable nicht existiert oder leer ist (ein leerer String, 0 als Integer, NULL, false, ein leeres Array oder eine deklarierte aber nicht initialisierte Variable). Folglich sollte empty benutzt werden. Anstelle von isset($array) && sizeof($array) > 0 kann viel kürzer !empty($array) geschrieben werden.

Switch Anweisungen:

Switch/Case Code-Blöcke können schnell lang werden. Um die Kontrolle zu behalten gelten die Regeln von geschweiften Klammern (welche zur besseren Lesbarkeit jeweils in einer eigenen Zeile sind), auch für die Switch, Case und break-Anweisungen. Ein Beispiel:

// Falsch switch ($mode) {	case 'mode1': // Irgendwelche Anweisungen break; case 'mode2': // Irgendwelche anderen Anweisungen break; }

// Richtig switch ($mode) {	case 'mode1': // Irgendwelche Anweisungen break;

case 'mode2': // Irgendwelche anderen Anweisungen break;

default: // Gehen Sie immer davon aus das nicht alle Sachen abgedeckt sind break; }

// Auch richtig, wenn sie mehr Code zwischen dem Case und break haben switch ($mode) {	case 'mode1':

// Irgendwelche Anweisungen

break; case 'mode2': // Irgendwelche anderen Anweisungen

break;

default:

// Gehen Sie immer davon aus das nicht alle Sachen abgedeckt sind

break; }

Selbst wenn der Standardfall nicht benötigt wird, ist es besser diesen zu verwenden - für bessere Lesbarkeit und der Vollständigkeit halber.

Wenn kein break zwischen den Cases vorkommen soll, kommentieren sie es an der Stelle, Beispiel: // Beispiel ohne break-Anweisung

switch ($mode) {	case 'mode1': // Ich mache irgendetwas

// no break here

case 'mode2':

// Ich mache irgendetwas anderes

break;

default:

// Gehen Sie immer davon aus das nicht alle Sachen abgedeckt sind

break; }

SQL/SQL-Anweisungen
Allgemeine SQL Richtlinien:

Alle SQL-Anweisungen sollten Datenbank übergreifend kompatibel sein, wenn Datenbank spezifische SQL Anweisungen verwendet werden, müssen auch alternative Möglichkeiten geboten werden die mit allen anderen Datenbanken funktionieren (MySQL3/4/5, MSSQL (7.0 und 2000), PostgreSQL (7.0+), Firebird, SQLite, Oracle8, ODBC (generalisiert wenn möglich)).

Alle SQL Anweisungen sollten die Datenbank Abstraktion (DBAL <-DataBase Abstraction Layer) benutzen.

SQL Code Layout:

SQL Anweisungen sind oft unformatiert unlesbar, weil sie manchmal dazu tendieren umfangreich zu sein. Durch das Formatieren von SQL Anweisungen soll die Lesbarkeit stark erhöht werden. SQL Anweisungen sollten auf folgende Weise formatiert werden: $sql = 'SELECT * <-one tab->FROM '. SOME_TABLE. ' <-one tab->WHERE a = 1 <-two tabs->AND (b = 2 <-three tabs->OR b = 3) <-one tab->ORDER BY b';


 * Hier ein Beispiel mit angewendeten Tabs

$sql = 'SELECT * FROM '. SOME_TABLE. ' 	WHERE a = 1 AND (b = 2 			OR b = 3) ORDER BY b';

SQL Anführungszeichen:

Doppelte Anführungszeichen wo sie benötigt werden (Die Variablen in diesen Beispielen wurden vorher als Integer gecastet) ... Beispiel:

// Falsch "UPDATE ". SOME_TABLE. " SET something = something_else WHERE a = $b";

'UPDATE '. SOME_TABLE. ' SET something = '. $user_id. ' WHERE a = '. $something;

// richtig 'UPDATE '. SOME_TABLE. " SET something = something_else WHERE a = $b";

'UPDATE '. SOME_TABLE. " SET something = $user_id WHERE a = $something";

In anderen Worten: benutzen Sie einfache Anführungszeichen wo keine Variablen vorkommen. Ansonsten verwenden Sie doppelte Anführungszeichen.

Vermeiden Sie DB spezifisches SQL:

Der ungleich Operator ist in SQL:2003 standardmäßig als &quot;<>&quot; definiert

// falsch $sql = 'SELECT * FROM '. SOME_TABLE. '	WHERE a != 2';

// richtig $sql = 'SELECT * FROM '. SOME_TABLE. '	WHERE a <> 2';

Allgemeine DBAL Methoden:


 * sql_escape:


 * Benutzen Sie bei Strings in SQL Anweisungen immer $db->sql_escape (selbst wenn sie sicher sind, das die Variablen keine einfachen Anführungszeichen enthalten können - vertrauen Sie nie auf ihre Eingaben), Beispiel:
 * $sql = 'SELECT *

FROM '. SOME_TABLE. "	WHERE username = '". $db->sql_escape($username). "'";


 * sql_query_limit:


 * Wir fügen keine Grenzen/Limits an die Anweisungen an, aber stattdessen benutzen wir $db->sql_query_limit. Sie sollten dem Query grundsätzlich die erwartete Zeilenanzahl und den Startpunkt mitgeben.


 * Achtung: Weil Oracle Limits anders handhabt und es anders implementiert, müssen Sie bei der Verwendung von sql_query_limit bei einem Ergebnis aus mehreren Tabellen besondere Vorsicht walten lassen.


 * Stellen Sie sicher wenn wie etwas wie "SELECT x.*, y.jars" das keine Zeile jars in x existiert; stellen Sie sicher das es keine Überschneidungen zwischen impliziten und expliziten Spalten gibt.


 * sql_build_array:


 * Wenn sie UPDATE oder INSERT Anweisungen verwenden, benutzen Sie die $db->sql_build_array Funktion. Diese Funktion escaped/maskiert Strings und überprüft andere Typen, so dass das in diesem Falle nicht mehr nötig ist. Die Daten die als Array hinzugefügt werden sollen gehören in $sql_ary - oder direkt in die Anweisung wenn ein oder zwei Variablen hinzugefügt oder upgedatet werden müssen. Als Beispiel für eine INSERT-Anweisung:
 * $sql_ary = array(

'somedata'		=> $my_string, 'otherdata'		=> $an_int, 'moredata'		=> $another_int );

$db->sql_query('INSERT INTO ' . SOME_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));


 * Um das Beispiel zu vervollständigen, hier ein Beispiel wie eine UPDATE-Anweisung aussehen sollte:
 * $sql_ary = array(

'somedata'		=> $my_string, 'otherdata'		=> $an_int, 'moredata'		=> $another_int );

$sql = 'UPDATE '. SOME_TABLE. ' 	SET '. $db->sql_build_array('UPDATE', $sql_ary). '	WHERE user_id = '. (int) $user_id; $db->sql_query($sql);


 * Die $db->sql_build_array Funktion unterstützt die folgenden Modi: INSERT (Beispiel s.o.), INSERT_SELECT (erstellen einer INSERT INTO table (...) SELECT value, column ... Anweisung), MULTI_INSERT (für die Rückgabe erweiterter INSERT ' s), UPDATE (Beispiel s.o.) und SELECT (für das bilden von WHERE und AND Anweisungen).


 * sql_in_set:


 * Die $db->sql_in_set Funktion sollte für IN  und NOT IN  Konstrukte verwendet werden. Weil (insbesondere) MySQL dazu tendiert bei nur einem Wert bei = und <> Operatoren schneller zu sein, verwenden wir die DBAL die entscheidet was benutzt wird. Ein typisches Beispiel für eine Suche nach einer Übereinstimmung gegen eine Anzahl von Werten würde Beispielsweise so aussehen:
 * $sql = 'SELECT *

FROM '. FORUMS_TABLE. '	WHERE '. $db->sql_in_set('forum_id', $forum_ids); $db->sql_query($sql);


 * Basierend auf der Anzahl der Anzahl der Werte der $forum_ids, kann die Anweisung unterschiedlich betrachtet werden.
 * // SQL Anweisung wenn $forum_ids = array(1, 2, 3);

SELECT FROM phpbb_forums WHERE forum_id IN (1, 2, 3)

// SQL Anweisung wenn $forum_ids = array(1) or $forum_ids = 1 SELECT FROM phpbb_forums WHERE forum_id = 1


 * Natürlich ist es genauso möglich für das Ausschließen einer Anzahl von Werten:
 * $sql = 'SELECT *

FROM '. FORUMS_TABLE. '	WHERE '. $db->sql_in_set('forum_id', $forum_ids, true); $db->sql_query($sql);


 * Basierend auf der Anzahl der Anzahl der Werte in $forum_ids, kann die Anweisung hier auch anders aussehen:
 * // SQL Anweisungen wenn $forum_ids = array(1, 2, 3);

SELECT FROM phpbb_forums WHERE forum_id NOT IN (1, 2, 3)

// SQL Anweisung wenn $forum_ids = array(1) or $forum_ids = 1 SELECT FROM phpbb_forums WHERE forum_id <> 1


 * Wenn das gegebene Array leer ist wird ein Fehler produziert.


 * sql_build_query:


 * Die $db->sql_build_query Funktion ist verantwortlich für das erstellen von sql-Anweisungen bei SELECT, SELECT DISTINCT, wenn benötigt JOIN für mehr als eine Tabelle oder bei Ergebnissen von mehr als einer Tabelle während der Benutzung von JOIN. Es muss benutzt werden um sicherzugehen das die resultierende Anweisung auf allen unterstützten Datenbanken funktioniert. Anstelle von Beispielen für jeden nur denkbaren Fall will ich nur ein kurzes Beispiel geben:
 * $sql_array = array(

'SELECT'	=> 'f.*, ft.mark_time',

'FROM'		=> array(		FORUMS_WATCH_TABLE	=> 'fw',		FORUMS_TABLE		=> 'f'	),

'LEFT_JOIN'	=> array(		array( 'FROM'	=> array(FORUMS_TRACK_TABLE => 'ft'), 'ON'	=> 'ft.user_id = '. $user->data['user_id']. ' AND ft.forum_id = f.forum_id' )	),

'WHERE'		=> 'fw.user_id = '. $user->data['user_id']. ' 		AND f.forum_id = fw.forum_id',

'ORDER_BY'	=> 'left_id' );

$sql = $db->sql_build_query('SELECT', $sql_array);


 * der optionale, erste Parameter bei sql_build_query ist SELECT oder SELECT_DISTINCT. Wie Sie sehen können, ist die Logik selbsterklärend. Um LEFT_JOIN zu verwenden, fügen Sie beispielsweise einfach ein weiteres Arras hinzu. Der zusätzliche Nutzen beim Benutzen dieses Konstrukts ist, dass Sie in der Lage sind Anweisungen abhängig von Bedingungen zu erstellen - als Beispiel wenn LEFT JOIN nur bei aktiviertem Topic-Tracking verwendet werden soll; dann würde eine kleine Anpassung reichen:
 * $sql_array = array(

'SELECT'	=> 'f.*',

'FROM'		=> array(		FORUMS_WATCH_TABLE	=> 'fw',		FORUMS_TABLE		=> 'f'	),

'WHERE'		=> 'fw.user_id = '. $user->data['user_id']. ' 		AND f.forum_id = fw.forum_id',

'ORDER_BY'	=> 'left_id' );

if ($config['load_db_lastread']) {	$sql_array['LEFT_JOIN'] = array(		array( 'FROM'	=> array(FORUMS_TRACK_TABLE => 'ft'), 'ON'	=> 'ft.user_id = '. $user->data['user_id']. ' AND ft.forum_id = f.forum_id' )	);

$sql_array['SELECT'] .= ', ft.mark_time '; } else {	// Hier werden die Cookie Daten gelesen }

$sql = $db->sql_build_query('SELECT', $sql_array);

Optimierungen
Operatoren in Schleifenköpfen:

Versuchen Sie immer ihre Schleifen zu optimieren wenn die Abbruchsbedingung eine Funktion enthält, weil dieser Teil jeden Durchlauf ausgeführt wird. For Anweisungen sollten deskriptive Namen gewählt werden. Beispiel:

// Bei jedem Durchgang wird die sizeof Funktion aufgerufen for ($i = 0; $i < sizeof($post_data); $i++) {	mache_irgendwas; }

// Sie sind in der Lage (nicht wechselnde) Bedingungen in der Schleife selbst zu definieren for ($i = 0, $size = sizeof($post_data); $i < $size; $i++) {	mache_etwas; }

Benutzung von in_array:

Versuchen Sie die Verwendung von in_array bei großen Arrays zu vermeiden, und versuchen Sie die Anweisungen nicht innerhalb von Schleifen zu benutzen, wenn das Array auf mehr als 20 Einträge überprüft werden soll. in_array kann sehr Zeit- und Leistungsintensiv sein. Bei kleineren Überprüfungen fällt es kaum auf, aber bei Überprüfungen mit einer Schleife in großen Arrays können alleine dafür einige Sekunden Bearbeitungszeit entstehen. Wenn sie diese Funktionalität benötigen, versuchen sie isset für Array Schlüssel zu benutzen, sogar wenn Werte und Schlüssel vertauscht werden müssen. Als Beispiel: Ein Aufruf von isset($array[$var]) ist viel schneller als in_array($var, array_keys($array)).

Allgemeine Richtlinien
Allgemeines:

Vertrauen Sie nie auf Benutzereingaben (das betrifft auch Server Variablen und Cookies).

Versuchen Sie die von einer Funktion zurückgelieferten Werte zu bereinigen.

Versuchen Sie alle Variablen in der Funktion zu bereinigen.

Die auth Klasse sollte für alle Berechtigungsprüfungen benutzt werden.

Es sollte kein Versuch gemacht werden Copyright Informationen zu entfernen (egal ob im Quellcode oder auf dem Display), genauso wenig wie das Copyright verändert werden sollte (es kann etwas hinzugefügt werden).

Variablen:

Benutzen Sie die request_var Funktion für alles außer für das überprüfen auf submit oder Variablen, von denen nur die Existenz überprüft wird.

Die request_var Funktion bestimmt den Typ der Variable vom zweiten Parameter (welcher auch den Standardwert setzt). Wenn Sie einen skalaren Variablen Typ bekommen wollen, müssen Sie das der request_var Funktion explizit sagen. Beispiele:

// Alte Methode, verwenden Sie diese nicht mehr $start = (isset($HTTP_GET_VARS['start'])) ? intval($HTTP_GET_VARS['start']) : intval($HTTP_POST_VARS['start']); $submit = (isset($HTTP_POST_VARS['submit'])) ? true : false;

// Benutzen Sie request_var und bestimmen sie den richtigen Typ und Standardwert $start = request_var('start', 0); $submit = (isset($_POST['submit'])) ? true : false;

// $start ist ein int, die folgende Benutzung von request_var ist dementsprechend falsch $start = request_var('start', '0');

// Beim Array: Schlüssel sind Zahlen, Werte sind standardmäßig 0 $mark_array = request_var('mark', array(0));

// Beim Array: Schlüssel sind Strings, Werte sind standardmäßig 0 $action_ary = request_var('action', array('' => 0));

Login Überprüfungen/Weiterleitungen:

Um die Login Box zu zeigen benutzen Sie login_forum_box($forum_data), oder die login_box Funktion.

Die login_box Funktion kann eine Weiterleitung als ersten Parameter haben. Die Faustregel: Verwenden Sie einen leeren String wenn Sie den Benutzer zur aktuellen Seite leiten wollen, sonst hängen sie die $SID nicht an den redirect String an (als Beispiel innerhalb von ucp/login leiten wir auf den Board-Index um, weil der Benutzer sonst zu dem login geleitet wird).

Heikle Handlungen:

Bei heiklen Handlungen lassen Sie den Benutzer immer die Handlung bestätigen. Für die Bestätigungsanzeige verwenden Sie die confirm_box Funktion.

Sessions:

Sessions sollten auf jeder Seite initialisiert werden, so nah am Anfang wie möglich. Verwenden Sie dafür folgenden Code: $user->session_begin; $auth->acl($user->data); $user->setup;

Der $user->setup Aufruf kann verwendet werden um weitere Sprachdateien einzubinden oder einen anderen Style anzuzeigen (verwendet in viewforum).

Fehler und Meldungen:

Alle Meldungen/Fehler Ausgaben sollten trigger_error verwenden, dazu benutzen Sie den passenden Meldungstyp und einen Sprach-String. Beispiel: trigger_error('NO_FORUM'); trigger_error($user->lang['NO_FORUM']); trigger_error('NO_APPROPRIATE_MODE', E_USER_ERROR);

URL Formatierungen:

Alle URLs die zu internen Dateien verlinken, benötigen eine Vorbereitung durch die $phpbb_root_path Variable. Innerhalb des Administrationspanels müssen alle URLs die zu URLs innerhalb des Admin Bereiches verlinken mit der $phpbb_admin_path Variable vorbereitet werden. Dies stellt sicher dass der Pfad immer richtig ist und Benutzer in der Lage sind den Admin Ordner umzubenennen ohne die Funktionalität einzuschränken (trotzdem werden einige Links nicht immer funktionieren, kleinere Anpassungen können nötig sein).

Die append_sid Funktion von 2.0.x ist ebenfalls verfügbar, aber Änderungen geschehen dort nicht automatisch. Bitte schauen Sie in die Code-Dokumentation wenn Sie weitere Details zu der Benutzung von append_sid erhalten wollen. Ein Beispiel Aufruf mit append_sid kann so aussehen: append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&amp;g=' . $row['group_id'])

Allgemeine Benutzung der Funktionen:

Manche der folgenden Funktionen sind nur aufgrund persönlicher Vorlieben gewählt worden und haben keinen anderen Sinn als den Code einheitlich zu gestalten.


 * Benutzen Sie sizeof anstelle von count
 * Benutzen Sie strpos anstelle von strstr
 * Benutzen Sie else if anstelle von elseif
 * Benutzen Sie false (kleingeschrieben) anstelle von FALSE
 * Benutzen Sie true (kleingeschrieben) anstelle von TRUE