Übergabe einer Variablen von einer PHP-Include-Datei an eine andere: global vs. not
Lesezeit: 6 Minuten
maxedison
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. Allerdings muss ich es in der Datei, die das erste Include aufruft, NICHT als global deklarieren. Beispielsweise:
WENN ich den globalen $name deklariere, bevor ich $name in end.inc wiedergebe, dann funktioniert es richtig. Die akzeptierte Antwort auf diesen Beitrag erklärt, dass dies von Ihrer Serverkonfiguration abhängt: Variablen in PHP von einer Datei zur anderen übergeben
Ich verwende einen Apache-Server. Wie würde ich es konfigurieren, damit es nicht erforderlich ist, $name als global zu deklarieren? Gibt es Vor-/Nachteile gegenüber dem anderen?
Includes sind keine Funktionen. include unterbricht nicht den Gültigkeitsbereich der Variablen. Es ist, als ob Sie den Inhalt der Include-Dateien direkt in das aufrufende Skript kopieren und einfügen würden.
– dqhendricks
13. Januar 11 um 1:32 Uhr
ist das Echo in end.inc innerhalb einer Funktion?
– dqhendricks
13. Januar 11 um 1:32 Uhr
das würde den Gültigkeitsbereich der Variablen sprengen. und in diesem Fall sollten Sie $name wahrscheinlich in einem Argument an die Funktion übergeben.
– dqhendricks
13. Januar 11 um 1:34 Uhr
Dies sollen funktioniert wie geschrieben!
– verzeihen ♦
13. Januar 11 um 1:36 Uhr
Das Echo in end.inc befindet sich nicht in einer Funktion. Nehmen Sie an, dass die drei Dateien, die ich oben beschrieben habe, nicht mehr und nicht weniger enthalten als genau das, was ich geschrieben habe.
– maxedison
14. Januar 11 um 21:01 Uhr
Michael Irigoyen
Die übergeordnete Datei hat Zugriff auf Variablen in beiden eingeschlossenen Dateien
Beim Einbinden von Dateien in PHP verhält es sich so, als wäre der Code in der Datei vorhanden, aus der sie eingebunden werden. Stellen Sie sich vor, Sie kopieren und fügen den Code aus jeder Ihrer enthaltenen Dateien direkt in Ihre ein index.php. So arbeitet PHP mit Includes.
Also, in Ihrem Beispiel, da Sie eine Variable namens gesetzt haben $name in deinem front.inc Datei und schloss dann beide ein front.inc und end.inc in deinem index.phpwirst du können echo Die Variable $name irgendwo nach dem include von front.inc in deinem index.php. Auch hier verarbeitet PHP Ihre index.php als wäre der code aus den beiden dateien die du einbindest Teil der Datei.
Die eingeschlossene Datei hat keinen Zugriff auf die andere eingeschlossene Datei
Wenn Sie ein platzieren echo innerhalb einer eingebundenen Datei auf eine Variable, die nicht in sich selbst definiert ist, erhalten Sie kein Ergebnis, da sie separat behandelt wird als jede andere eingebundene Datei.
Mit anderen Worten, um das erwartete Verhalten auszuführen, müssen Sie es als global definieren.
Deine 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, äquivalent zu: $name = ‘james’; echo $name; echo $name; — Das sollte Jamesjames produzieren. Aber Ihr vorletzter Absatz widerspricht dem, was ich gerade beschrieben habe. Vielleicht meinen Sie, dass NUR die Datei, die den Include-Aufruf durchführt, Zugriff auf die Variablen der eingeschlossenen Datei hat, sodass andere eingeschlossene Dateien KEINEN Zugriff auf diese Variablen haben. Ist das korrekt?
– maxedison
14. Januar 11 um 21:00 Uhr
Ja, das klingt richtig. Entschuldigung, wenn ich das, was ich gesagt habe, verwirrend war. Ich habe es ungefähr 5 Mal bearbeitet, weil es mir wirklich schwer fiel, den Prozess zu beschreiben, ohne dass Sie sich verlaufen. Die übergeordnete Datei hat also Zugriff auf Variablen in beiden eingeschlossenen Dateien, aber die eingeschlossene Datei hat keinen Zugriff auf die andere eingeschlossene Datei. Falls das Sinn macht.
– Michael Irigoyen
14. Januar 11 um 21:10 Uhr
Abgestimmt, weil die ersten beiden Absätze dem folgenden Satz ausdrücklich widersprechen.
– Mucke
10. Dezember 18 um 7:31 Uhr
@JoshuaFlood Ich habe Teile des Kommentars des Autors als Überschriften für die beiden Teile der Antwort hinzugefügt, um die Antwort klarer zu machen und Verwirrung beim Lesen zu vermeiden.
– Gleb Kemarsky
30. August 21 um 7:19 Uhr
Geändert zu einer Upvote @GlebKemarsky
– Mucke
13. Oktober 21 um 12:13 Uhr
Kağan Kayal
Hier ist eine Falle zu vermeiden. Falls 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 dazu wäre:
include('front.inc');
function foo() {
global $name;
echo $name;
}
function bar() {
global $name;
echo $name;
}
foo();
bar();
Mit anderen Worten: schreiben global $var bevor Sie es in einer anderen Funktion verwenden.
– Chris Glücklich
30. Juni 17 um 0:51 Uhr
Paul Appleby
Das ist alles, was Sie tun müssen:
Vorne inkl
global $name;
$name="james";
Fügen Sie eine Erklärung mit der Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems hilft
– ρяσѕρєя K
18. Januar 17 um 4:31 Uhr
Ich hatte das gleiche Problem wie von maxedison beschrieben. Ich war auch mit vielen Antworten verwirrt: “php process include like you copy and paste …”, was nicht wahr ist, und dank Michaels Erklärung unter seiner Antwort verstehe ich, dass der Code in der eingeschlossenen Datei die in der vorherigen Include-Datei definierte globale Variable nicht erkennt . Bei meinen Experimenten habe ich auch festgestellt, dass ich dies korrigieren kann, wenn ich das Schlüsselwort “global” im ersten Iclude verwende – wie Paul antwortete. Aber wo finde ich beide in der PHP-Dokumentation beschriebenen Fälle? Und die zweite Frage ist, ob beide nicht nur von einer PHP-Version wahr sind?
SO definitiv ist das Ausführen eines Include NICHT wie das Kopieren/Einfügen von Code, zumindest in einigen PHP-Versionen.
Es geht um Reichweite. Es scheint, dass in PHP die im globalen Geltungsbereich definierten Variablen nicht automatisch im Geltungsbereich der Funktion vererbt werden. Deshalb müssen Sie innerhalb eines Funktionskörpers der Variablen das voranstellen global Stichwort.
Aus dem PHP-Handbuch:
Eine echte globale Variable, die innerhalb eines Funktionsbereichs mit der globalen Anweisung importiert wird, erstellt tatsächlich einen Verweis auf die globale Variable.
Also die Variable $name ist für beide Includes verfügbar (front.inc und end.inc ), aber jede in diesen Dateien definierte Funktion hätte keinen Zugriff auf die Variable $name es sei denn, die global Schlüsselwort verwendet wird oder die $GLOBALS Konstante.
<?php
$a = 1; /* global scope */
function test()
{
/* the code below will throw a Warning: Undefined variable $a ... */
echo $a; /* reference to local scope variable */
}
Um den Variablenwert zu erhalten, müssen Sie global $a wie folgt aufrufen:
<?php
$a = 2; /* global scope */
function test2() {
global $a;
/* now we have access to the global $a so no more warnings */
echo $a;
}
Darauf können Sie sich auch verlassen $GLOBALS So erhalten Sie Zugriff auf das Global:
<?php
$a = 3; /* global scope */
function test3() {
echo $GLOBALS['a'];
}
Sie können eine Liste aller globalen Variablen mit einem Code wie diesem erhalten:
echo "<pre>";
print_r($GLOBALS);
echo "</pre>";
Quelle für obigen Code: Ist es möglich, alle globalen Variablen in PHP aufzulisten?
.
8215700cookie-checkÜbergabe einer Variablen von einer PHP-Include-Datei an eine andere: global vs. notyes
Includes sind keine Funktionen. include unterbricht nicht den Gültigkeitsbereich der Variablen. Es ist, als ob Sie den Inhalt der Include-Dateien direkt in das aufrufende Skript kopieren und einfügen würden.
– dqhendricks
13. Januar 11 um 1:32 Uhr
ist das Echo in end.inc innerhalb einer Funktion?
– dqhendricks
13. Januar 11 um 1:32 Uhr
das würde den Gültigkeitsbereich der Variablen sprengen. und in diesem Fall sollten Sie $name wahrscheinlich in einem Argument an die Funktion übergeben.
– dqhendricks
13. Januar 11 um 1:34 Uhr
Dies sollen funktioniert wie geschrieben!
– verzeihen
♦
13. Januar 11 um 1:36 Uhr
Das Echo in end.inc befindet sich nicht in einer Funktion. Nehmen Sie an, dass die drei Dateien, die ich oben beschrieben habe, nicht mehr und nicht weniger enthalten als genau das, was ich geschrieben habe.
– maxedison
14. Januar 11 um 21:01 Uhr