Übergabe einer Variablen von einer PHP-Include-Datei an eine andere: global vs. nicht

76

Ich versuche, eine Variable von einer Include-Datei an eine andere zu übergeben. Dies funktioniert NICHT, es sei denn, ich deklariere die Variable in der zweiten Include-Datei als global. Ich muss es jedoch NICHT als global in der Datei deklarieren, die das erste Include aufruft. Zum Beispiel:


front.inc:

$name = 'james';

index.php:

include('front.inc');
echo $name;
include('end.inc');

Ausgabe: James


end.inc:

echo $name;

Ausgabe: nichts


WENN ich den globalen $ name deklariere, bevor ich $ name in end.inc wiedergebe, funktioniert es ordnungsgemäß. Die akzeptierte Antwort auf diesen Beitrag erklärt, dass dies von Ihrer Serverkonfiguration abhängt: Übergeben von Variablen in PHP von einer Datei in eine andere

Ich verwende einen Apache-Server. Wie würde ich es so konfigurieren, dass es nicht erforderlich ist, $ name als global zu deklarieren? Gibt es Vor- und Nachteile gegenüber dem anderen?

Maxedison
quelle
2
Includes sind keine ähnlichen Funktionen. Includes unterbrechen nicht den variablen Bereich. Es ist, als würden Sie den Inhalt der Include-Dateien direkt in das aufrufende Skript kopieren.
Dqhendricks
2
Ist das Echo in end.inc innerhalb einer Funktion?
Dqhendricks
2
das würde den variablen Bereich brechen. und in diesem Fall sollten Sie wahrscheinlich $ name an die Funktion in einem Argument übergeben.
Dqhendricks
Dies sollte wie geschrieben funktionieren!
Täuschung
Das Echo in end.inc befindet sich nicht in einer Funktion. Angenommen, die drei oben beschriebenen Dateien enthalten nicht mehr und nicht weniger als genau das, was ich geschrieben habe.
Maxedison

Antworten:

62

Wenn Sie Dateien in PHP aufnehmen, verhält es sich so, als ob der Code in der Datei vorhanden ist, aus der sie aufgenommen werden. Stellen Sie sich vor, Sie kopieren und fügen den Code aus jeder Ihrer enthaltenen Dateien direkt in Ihre ein index.php. So funktioniert PHP mit Includes.

Also, in Ihrem Beispiel, da Sie eine Variable mit dem Namen festgelegt haben , $namein Ihrer front.incDatei, und beide enthielten front.incund end.incin Ihrem index.php, sind Sie in der Lage sein , echodie Variable $nameüberall nach dem includevon front.incinnerhalb Ihrer index.php. Auch hier verarbeitet PHP Ihre Daten so, index.phpals ob der Code aus den beiden von Ihnen enthaltenen Dateien Teil der Datei wäre.

Wenn Sie echoeine Variable in eine eingeschlossene Datei einfügen, die nicht in sich selbst definiert ist, erhalten Sie kein Ergebnis, da sie separat behandelt wird als jede andere eingeschlossene Datei.

Mit anderen Worten, um das erwartete Verhalten zu erzielen, müssen Sie es als global definieren.

Michael Irigoyen
quelle
51
Ihre Antwort scheint sich zu widersprechen. Sie haben ein paar Mal gesagt, dass das Einfügen einer Datei dasselbe ist, als ob der gesamte Code einfach Teil einer Datei wäre. Daher würde das, was ich in meinem Beitrag beschrieben habe, entsprechen: $ name = 'james'; echo $ name; echo $ name; - Das sollte Jamesjames produzieren. Aber Ihr vorletzter Absatz widerspricht dem, was ich gerade beschrieben habe. Vielleicht meinen Sie damit, dass NUR die Datei, die den Include-Aufruf ausführt, Zugriff auf die Variablen der enthaltenen Datei hat, sodass andere enthaltene Dateien KEINEN Zugriff auf diese Variablen haben. Ist das korrekt?
Maxedison
24
Ja, das klingt richtig. Entschuldigung, wenn ich das, was ich sagte, verwirrend war. Ich habe es wie 5 Mal bearbeitet, weil ich es wirklich schwer hatte, den Prozess zu beschreiben, ohne dich zu verlieren. Die übergeordnete Datei hat also Zugriff auf Variablen in beiden enthaltenen Dateien, aber die enthaltene Datei hat keinen Zugriff auf die andere enthaltene Datei. Wenn das Sinn macht.
Michael Irigoyen
Neben der akzeptierten Antwort ist auch die Korrektur falsch (oder veraltet). In PHP7 (zumindest) kann ich eine Variable in definieren included1.phpund später darauf included2.phpverweisen, ohne darauf zu verweisen parent.php, und den Wert erhalten, in dem ich definiert habe included1.php. Ich befolge die gleichen Bereichsregeln wie bei einem Code auf einer einzigen Seite. Nichts mehr.
biscuitstack
3
Abgestimmt, weil die ersten beiden Absätze dem folgenden Satz ausdrücklich widersprechen.
Joshua Flood
Kurz gesagt: Wirf deine eingeschlossene Datei in eine Funktion und übergebe die benötigten Variablen als Parameter. Es ist widerlich, aber es funktioniert. 😒︀
John
32

Hier ist eine Falle zu vermeiden. Wenn Sie innerhalb einer Funktion auf Ihre Variable $ name zugreifen müssen, müssen Sie "global $ name" sagen. am Anfang dieser Funktion. Sie müssen dies für jede Funktion in derselben Datei wiederholen.

include('front.inc');
global $name;

function foo() {
  echo $name;
}

function bar() {
  echo $name;
}

foo();
bar();

zeigt nur Fehler an. Der richtige Weg, dies zu tun, wäre:

include('front.inc');

function foo() {
  global $name;
  echo $name;
}

function bar() {
  global $name;
  echo $name;
}

foo();
bar();
Kağan Kayal
quelle
Mit anderen Worten: Schreiben global $varSie , bevor Sie es in einer anderen Funktion verwenden.
Chris Happy
2

Das ist alles was Sie tun müssen:

Vorne

global $name;
$name = 'james';
Paul Appleby
quelle
2
Fügen Sie eine Erklärung mit Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems
hilft
1
Ich hatte das gleiche Problem wie von Maxedison beschrieben. Ich war auch verwirrt mit vielen Antworten: "PHP-Prozess enthält wie Sie kopieren und einfügen ...", was nicht wahr ist und dank Michaels Erklärung unter seiner Antwort verstehe ich, dass Code in der enthaltenen Datei die in der vorherigen Include-Datei definierte globale Variable nicht erkennt . In meinen Experimenten habe ich auch festgestellt, dass wenn ich im ersten iclude das "globale" Schlüsselwort verwende, dies korrigiert werden kann - wie es Paul beantwortet hat. Aber wo finde ich beide Fälle, die in der PHP-Dokumentation beschrieben sind? Und die zweite Frage ist, ob beide nicht nur für eine PHP-Version zutreffen.
StackPeter