mmofacts.com

Include/require/_once

gepostet vor 19 Jahre, 5 Monate von Mays
Ich habe mir diese vier Sachen jetzt mahl näher angeschaut, bis jetzt habe ich immer nur include benutzt um Dateien einzubinden. Habe zwar schon von den anderen gehört, mir aber sie nie näher angeschaut, bis eben.

Include und require ist der einzigste Unterschied das sie unterschiedliche Fehlermeldungen zurück geben.
Nur zu den once Teilen versteh ichs nicht. Im Manual steht

require_once() sollten Sie in den Fällen benutzen, wenn die gleiche Datei in einem bestimmten Bereich mehrmals eingebunden und interpretiert werden soll und Sie sicher stellen wollen, dass diese Datei nur exakt einmal eingebunden wird, um Probleme mit Wiederholungen bei Funktions-Definitionen und Wertzuweisungen zu Variablen zu vermeiden, usw.

Mit include füge ich die Datei doch auch nur einmahl ein oder?
gepostet vor 19 Jahre, 5 Monate von TheUndeadable
Jein.

Nehmen wir mal an:

Datei a:

include ( b )
include ( c )

Datei b:

include ( c )

Datei c:

Gar inkludiert

Datei c wird nun 2 mal inkludiert. Dies kann Fehler versachen. Mit include_once verhinderst du das.

Der Unterschied zwischen require und include ist nur ein kleiner feiner.
Include wird zur Laufzeit ausgeführt, require eher zur Parsezeit. Auf gut Deutsch:

if ( $bool )
{ include ( 'datei.php' ); }

bindet datei.php nur ein, wenn ins if gesprungen wird

if ( $bool )
{ require ( 'datei.php' ); }

fügt datei.php auf jeden Fall ein. Dieser Unterschied wird höchst selten genutzt. Unter anderem um Klassen zur Laufzeit einzuladen. (Evtl vertausche ich gerade require und include). Ich meine mal gehört zu haben, dass require_once etwas schneller ist.
gepostet vor 19 Jahre, 5 Monate von neit
Mit normalem include bzw require kannst du eine Datei in der Tat mehrmals einbinden. Beispiel:

include 'functions.php';


php-block

include 'functions.php';

Wenn du jetzt aber in der datei functions.php eine Funktion deklariert hast wird obiges Beispiel einen Fehler bringen, weil du jeden Funktionsnamen nur einmal verwenden darfst. Um solche Mißgeschicke zu umgehen ist die _once-Geschichte nützlich. Dort wird vorher nämlich überprüft ob die Datei vorher woanders schon eingebunden wurde und wenn dies der Fall ist, der Befehl einfach übersrpungen.



Edit: Oke, da war einer schneller, naja vielleicht ist meins ja wenigstens verständlicher ...
gepostet vor 19 Jahre, 5 Monate von None
Der Unterschied zwischen require und include sind nur die Fehler die sie erzeugen.
Include erzeugt eine Warnung und require einen Fatal Error.

Daraus folgt: schlägt include fehl kommt nur eine Warnung. Schlägt require fehlt bricht das Script ab.

Mit require_once & include_once verhält es sich genauso. Wobei *_once immer nur eine Datei einbindet welche NICHT schon eingebunden ist.
gepostet vor 19 Jahre, 5 Monate von Kampfhoernchen
Aus diesem Grund rate ich eigentlich zu requires, da, wenn das Einbinden schief läuft, eine weitere Abarbeitung meist keinen Sinn macht, da dann nur weitere Fehler produziert werden (meist "call to undefinded function").

Das Once kann ich auch nur empfehlen, auch so lassen sich Fehler vermeiden. Wenn du einen code einfach nur 2 mal verwenden willst, macht auch ein normaler require Sinn (wenn dann auch Funktionen wahrscheinlich eleganter sind).

Performancemäßig sollts da keinen Unterschied geben, denke ich. Include ist eigentlich zwar keine Funktion, sondern ein Schlüsselwort, wodurch man auf die Klammern verzichten kann. Aber man sollte sie trotzdem machen, schon wegen den Einheitlichkeit.
gepostet vor 19 Jahre, 5 Monate von None
Wahrscheinlich verweisen include und require intern eh auf die selbe routine, daher würde ich auch behaupten das beide gleichschnell sind.

ich binde vor allen Klassen-Libs ein require_once() ein wenn z.B. einige andere Dateien gebraucht werden. So kann ich sicher sein das immer alles genau einmal eingebunden ist was ich bennötige.
gepostet vor 19 Jahre, 5 Monate von TheUndeadable
Ich nehm alles bzgl der Unterschiede zurück. Aus dem PHP-Source:
 

case ZEND_INCLUDE_ONCE:
case ZEND_REQUIRE_ONCE: {
int dummy = 1;
[...] }
break;
case ZEND_INCLUDE:
case ZEND_REQUIRE:
new_op_array = compile_filename(opline->op2.u.constant.value.lval, inc_filename TSRMLS_CC);



include und require scheinen äquivalent zu sein

Auf diese Diskussion antworten