Sven Rautenberg: include_once vs. include

Beitrag lesen

Moin!

Weil beides [include/include_once] im Fehlerfall nur eine Warnung produziert und ansonsten weitermacht.
was genau meinst Du denn mit "Fehlerfall"? Dass die Ressource, die includet werden soll, nicht vorhanden ist? Oder dass aus einem technischen Grund der Include nicht funktioniert hat? Falls letzteres überhaupt möglich ist, dann würde doch die komplette Skriptverarbeitung auch nicht funktionieren. Oder meintest Du mit "Fehlerfall" etwas ganz anderes?

Fehlerfall ist, wenn das Inkludieren als solches aus welchem Grund auch immer erfolglos war. Das PHP-Handbuch führt an, dass ein Grund eine nicht vorhandenen Datei ist. Vermutlich zählen auch noch fehlende Zugriffsberechtigungen dazu. Fehler beim Parsen zählen extra.

Der Meinung, include(_once) generell zu vermeiden, wie Sven es einleitend vorschlug, schließe ich mich nicht an. Nicht in jedem Fall will man dem Anwender nur eine PHP-Fehlermeldung oder auch nur einen unbegründeten (wenn display_errors ausgeschaltet ist) Abbruch anbieten. Bei include(_once) hat man zumindest die Möglichkeit mit eigenem Code das Fehlen abzufangen und noch einen geordneten Abschluss hinzulegen. Nun kann das Argument kommen, dass man dann vorher mal ein is_readable() anwenden kann. Kann man - wenn der zweifache Dateisystemzugriff bei jedem Mal billiger ist, als ein @ und das Auswerten hinterher. Das sollte man aber für seine Soituation individuell klären.

Meine Forderung war, grundsätzlich require() einzusetzen, und include() nur im Ausnahmefall. Ein Ausnahmefall ist genau das, was du beschreibst: Man kann evtl. nicht sicherstellen, dass die Zieldatei zu 100% immer vorhanden ist, und möchte alternativ ein eigenes Fehlerprogramm abspulen. Klassischer Fall: Template-Dateien.

Aber das Einbinden z.B. von Klassen (egal ob via Autoload oder "normal" explizit) darf nicht scheitern, und ein Alternativprogramm wird an dieser Stelle auch nicht funktionieren. Solche Fehlerzustände sollten allerdings auch nur zur Entwicklungszeit auftreten, und die will man an dieser Stelle nicht unbemerkt lassen, sondern beheben.

Es kann ja z.B. sein, dass man explizit eine Klasse includet, aber nicht mehr verwendet, und die Datei deshalb auch löscht - nur das (ggf. verteilte) include() nicht, weil man es nicht mehr findet. Diese kaputten Includes kosten ab dann kräftig Ladezeit (der include_path wird komplett nach der nicht mehr existierenden Datei durchsucht) und bringt Verwirrung (ist das Include falsch, oder fehlt die Datei?). Hätte man require() verwendet, würde das Problem nicht entstehen.

Deshalb lautet mein Rat: Immer require() verwenden, außer man weiß, dass man die fehlertolerantere Variante include() benötigt.

- Sven Rautenberg