Fatal error: Cannot redeclare abc() (previously declared in .../xy.php:xx) in .../xyz.php on line xx
Was will und diese Fehlermeldung sagen?
Die Antwort ist recht simple:
Der Fehler kommt weil eine Funktion definiert wird die es bereits gibt!
Da es sich (in diesem Fall) nicht um eine Funktion vom PHP-Interpreter handelt, wurde sie also bereits an anderer stelle definiert. Und die Fehlermeldung sagt uns sogar genau wo. 8)
- Cannot redeclare abc() gibt an welche Funktion es sich handelt.
- (previously declared in .../xy.php:xx) besagt das die Funktion in Datei: xy.php Zeile: xx zum erstem mal definiert wurde.
- und in .../xyz.php on line xx sagt uns das die Funktion in Datei: xyz.php Zeile: xx erneut definiert wird.
Nachteil dieser Methode ist, das die beiden Datei angaben der Fehlermeldung identisch sind.
Wir müssen also wissen welche (Haupt-)Datei aufgerufen wurde, als der Fehler gemeldet wurde!
In dieser Datei suchen wir dann den Code include('xyz.php); (beim phpBB sieht er meist so aus: include($phpbb_root_path.'includes/xyz'.$phpEx);) und ersetzen ihn gegen include_once('xyz.php);.
Warum?
Um Sicherzustellen das nicht mehrmals eingebunden wird, gibt es den Befehl include_once(); (genau genommen ist das auch eine Funktion).
Der Unterschied zwischen include(); und include_once(); ist, das include_once(); prüft ob die entsprechende Datei bereits an andere Stelle inkludiert wurde und dementsprechend, die Datei, einbindet oder eben nicht. 8)
Warum dann nicht einfach nur include_once(); verwenden?
Ganz einfach: Die Funktion erzeugt Zeiger auf Dateien und deren Inhalt, welcher wiederum Hauptspeicher belegt! Bei Umfangreichen Projekten, wie das phpBB, würde dies dazu führen das der Speicher voll läuft, was wiederum auch zu Fehlern führt.
Das gleiche gilt für require(); und require_once();!
Diese beiden Befehle (Funktionen) includieren ebenfalls Dateien. Mit dem Unterschied das sie beim auftreten von Fehlern, die Ausführung der aufrufenden Datei abbrechen.
Diese beide Befehle werden aber beim phpBB eher selten bis garnicht eingesetzt.
Eine ausführlichere Beschreibung der include(); und require(); Befehle ist hier auf oxpus.de zu finden.