am 24. Dezember 2008
Nur schon mal vorweg, alles was ich hier schreibe gilt auch für require und require_once.
Ich wurde schön des öfteren gefragt, wann man include und wann include_once verwenden sollte. Die Antwort ist meiner Meinung nach ganz einfach. Include nie, include_once immer. Aber wie meistens kann man sich über dieses Thema auch gediegen streiten. Ich, in meiner objektorientierten Denkweise, sehe aber keinen Grund eine Datei mehrmals inkludieren zu wollen.
Pro Datei existiert genau eine Klasse und kein ausführbarer Code. Die einzige Stelle, in der solcher Code vorhanden ist, sollte die index.php sein. Natürlich gibt es auch ein paar Ausnahmen, die von PHP vorgegeben sind. So würde ich die autoload Methoden zum Beispiel nicht in eine Klasse packen. Aber auch eine Datei, in der diese Methoden vorhanden sind, sollte genau einmal inkludiert werden. In den meisten Fällen kann ein include durch die Verwendung einer Funktion ersetzt werden. Wer includes einsetzt, um duplizierten Code zu verhindern, der sollte auf traits warten, denn diese sind für genau solche Fälle gemacht. Und wenn ich ehrlich bin, dann habe ich lieber doppelten Code, als includes, denn hier versagen wenigstens die Methoden der statischen Codeanalyse nicht. Und auch wenn sie vielleicht nicht versagen, erschwert wird es dadurch erheblich.
Falls ihr euch nichts unter dem Codeduplizieren vorstellen könnt, hier ein kleines Beispiel:
<?php
class ASingleton
{
// ...
public static function getInstance( )
{
return include 'singleton_getInstance.php';
}
}
?>
In der singleton_getInstance.php steht nun der Code, der dazu benötigt wird eine Instanz zu erstellen. Eine Klasse BSingleton könnte nun genau den gleichen Code Snippet verwenden. Vielleicht denkt ihr euch jetzt, dass man das ganze auch über Ableitung hinbekommen könnte, aber da gibt es ein Problem. Zieht man hier Vererbung hinzu, so verbauen wir uns die Möglichkeit von anderen Klassen abzuleiten und in den meisten Fällen wollen wir das nicht.