4 Stimmen

Zugriff auf globale Variable in eingeschlossener Datei nicht möglich

Ich habe ein unerwartetes Problem mit Scope. Die include Dokumentation (gilt auch für require_once ) besagt, dass die angeforderte Datei Zugriff auf alle Variablen in der Zeile haben sollte, in der sie angefordert wurde.

Aus irgendeinem Grund bin ich nicht in der Lage, eine Klasse instanziiert mit globalen Bereich innerhalb einer Funktion zugreifen, die in erforderlich war.

Weiß jemand, warum? Ich übersehe offensichtlich etwas.

Ich habe es durch einen Verweis auf $GLOBALS[] aber ich möchte trotzdem wissen, warum es nicht funktioniert.

UPDATE:
Der Fehler, den ich erhalte, lautet:

Fatal error: Call to a member function isAdmin() on a non-object in <path>.php on <line>

Code:

$newClass = new myClass();

require_once("path to my file");

----- inside required file -----
function someFunction() {
     $newClass->someMethod(); // gives fatal error. (see above).
}

4voto

kapa Punkte 75108

Funktionen definieren einen neuen Bereich, so dass Sie innerhalb einer Funktion nicht auf Variablen im globalen Bereich zugreifen können.

Variabler Umfang

innerhalb benutzerdefinierter Funktionen eine lokale Funktionsumfang eingeführt. Jede Variable, die innerhalb einer Funktion verwendet wird, ist durch standardmäßig auf den lokalen Funktionsbereich Bereich

Über enthaltene Dateien, Im Handbuch heißt es :

Wenn eine Datei eingebunden wird, wird der Code Code den Variablenbereich der Zeile, in der das Include auftritt.

Wenn Sie also etwas in eine Funktion einschließen, ist der Geltungsbereich der eingeschlossenen Datei derjenige der Funktion.

UPDATE: Schauen Sie sich Ihr Codebeispiel an, das in die Frage eingefügt wurde, global $newClass; als erste Zeile der Funktion sollte es funktionieren.

$newClass = new myClass();
require_once("path to my file");

----- inside required file -----
function someFunction() {
     global $newClass;
     $newClass->someMethod(); 
}

Beachten Sie jedoch, dass die Verwendung von global kann die Wartung Ihres Codes schnell erschweren. Verlassen Sie sich nicht auf den globalen Geltungsbereich, sondern übergeben Sie das Objekt als Parameter an die Funktion oder verwenden Sie eine Singleton/Registry-Klasse (manche neigen dazu, gegen Letzteres zu argumentieren, aber je nach Fall kann es eine sauberere Lösung sein).

0 Stimmen

Ich habe sogar versucht, global $myClass aufzurufen; hat nicht funktioniert. Es funktionierte mit $GLOBALS["myClass"].

0 Stimmen

Schauen Sie sich Ihr Codebeispiel an, das in die Frage eingefügt wurde, global $newClass; als erste Zeile der Funktion sollte es funktionieren.

0 Stimmen

@John, global $myClass (oder global $newClass in Ihrem obigen Beispiel) sollte wie gewohnt funktionieren. Ich habe es gerade getestet und es ist in keiner Weise anders, als wenn die Funktion im Hauptskript definiert wäre.

2voto

rid Punkte 58329

Der enthaltene Code hat keinen anderen Geltungsbereich als der ihn umgebende Code. Zum Beispiel:

function a() {
    echo $b;
}

Dies wird auch dann nicht funktionieren, wenn echo $b befindet sich in einer eingeschlossenen Datei. Ersetzen Sie den obigen Text durch:

function a() {
    include 'file.php';
}

... und file.php enthält:

echo $b;

... dann ist es das Gleiche, als wenn Sie schreiben würden:

function a() {
    echo $b;
}

Stellen Sie es sich so vor: Wann immer Sie die include / require wird der Inhalt der eingeschlossenen Datei an die Stelle der include / require Anweisung, so als hätten Sie die Anweisung entfernt und den Inhalt der Datei an ihrer Stelle eingefügt.

Was den Anwendungsbereich betrifft, so tut er nichts anderes.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X