2010-10-11 6 views
12

Wenn ich eine include oder require Anweisung innerhalb einer Bedingung, die false auswertet, wird der PHP-Interpreter die Include-Datei insgesamt überspringen, oder wird es nur für den Fall laden?PHP-Verhalten von include/require innerhalb konditionaler

Ein Beispiel wäre:

if ($some_user_var) { 
    require 'this.php'; 
} else { 
    //do stuff 
} 

ich irgendwo gelesen, dass require immer vom Interpreter enthalten sein, unabhängig von den bedingten, aber include nicht. Wenn dies der Fall ist, kann der Wechsel von require zu include aufgrund des reduzierten I/O- und Parsing-Overhead eine freie Beschleunigung bedeuten.

Es macht wahrscheinlich einen Unterschied, wenn ich einen Präprozessor wie eAccelerator laufen lasse, aber nehmen wir an, dass ich nicht tue.

+0

Ich denke, dass was Sie irgendwo gelesen haben war etwas wie folgt: 'require' wird die Ausführung mit schwerwiegenden Fehler abbrechen, während 'include' wird nicht (bei Fehler, natürlich). Was wie 'require' interpretiert werden kann, wird immer Ihre Datei einschließen oder das Skript wird sterben. – acm

+0

Hast du zufällig dieses Buch? http://www.amazon.co.uk/PHP-World-Wide-Web-Quickstart/dp/0321245652 Mir wurde diese Lüge gelehrt! – Matthew

Antwort

20

Es wird nur aufgenommen, wenn die Bedingung zutrifft. Ich weiß nicht wo du sonst liest, aber sie liegen falsch.

Der einzige Unterschied zwischen include und require ist, dass include eine Warnung aus, wenn es fehlschlägt, während require einen fatalen Fehler werfen.

Um dies zu bestätigen, siehe the PHP manual page for require.

-

(ps wenn Sie bedingte tust enthält, je nachdem, was die reaon ist, können Sie mit include_once() oder require_once() stattdessen betrachten)
+1

IIRC, das Verhalten, das er beschreibt, war bis PHP 4.etwas. –

+0

Oh, ich benutze tatsächlich require_once, ich habe nur für die Frage vereinfacht. Aber danke –

+0

Danke für den Link zur Handbuchseite. Von einem der Kommentare: "Da die manuellen Zustände erfordern und require_once ab PHP 4.02 nicht mehr die Datei aufrufen, wenn die Codezeile, auf der sie sich befindet, nicht ausgeführt werden sollte". Perfekt :) –

1

Dies ist nicht korrekt. require enthält keine Dateien, die in Blöcke gehüllt sind, in denen sie nie aufgerufen werden. Der PHP-Interpreter ignoriert sie nicht. include und require haben wenig bis gar keinen Leistungsunterschied (in der Tat haben sie auch keinen großen Unterschied zu _once, obwohl es signifikanter ist).

1

ich, dass irgendwo zu lesen. Das Argument lautet ungefähr:

Wenn Sie eine Bedingung um ein Include setzen, hat PHP keine Möglichkeit zu wissen, ob es erforderlich ist oder nicht, bis es den Code zu interpretieren beginnt und den Code nicht interpretieren kann Halten Sie alle Variablen und Funktionen und damit - Dateien. Also lädt es alle Dateien unabhängig von der Bedingung hoch und lässt sie dann aus der endgültigen "Kompilierung" zurückfallen.

Auch wenn Sie dann eine Bedingung um eine PHP-Datei mit einem Fehler in es umbrechen, bricht es es nicht. Und wenn Sie eine Variable in einer eingeschlossenen Datei deklarieren und dann den Wert der Variablen verwenden, um zu bestimmen, ob sie eingeschlossen wird, nimmt sie ihren Wert nicht auf :)

Vielleicht war das früher ein Problem in alten Versionen von PHP?

Ich habe es nicht in Bezug auf Ladegeschwindigkeit und RAM-Auslastung getestet - aber ich würde gerne eine definitive Antwort darauf erhalten. Gibt es irgendwelche Overhead mit bedingten Includes beteiligt?

+0

Gute Beobachtung über das Einschließen von Dateien mit Fehlern in ihnen. Wenn es sie vorher geladen hat, könntest du das testen, indem du eine explosiv schlechte Datei einfügst. – Frug

Verwandte Themen