2017-01-11 6 views
-1

In Ordnung, ich habe den Code ein wenig verdummt ... Ich bin mir nicht sicher, ob das, was ich erreichen will, möglich ist oder nicht.Wie kann ich bei Verwendung von include innerhalb einer Funktion auf eine Variable zugreifen, die vor dem Include deklariert wurde?

Ich habe eine Klasse namens Beispiel mit einem Template-Funktion aufgerufen, die mit 1 Parameter

Class Example{ 
    public function Template($root){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

Ich habe eine Reihe von Produkten hat, instanziiert ich die Klasse und führen Sie die Template-Funktion

$products = array("garbage"); 
$test = new Example; 
$test->Template("product"); 

Hier ist ein Beispiel Kopie der /templates/product.php

print 'Test'; 
print_r($products); 

Ich komme zurück Eine Seite, die "Test" anzeigt, aber ich kann nicht auf das Array $products zugreifen, das vor der Template-Funktion definiert wurde.

Wenn ich die direkte include ROOT."/templates/product.php"; Route gehe, funktioniert alles.

Kann ich Include nicht innerhalb einer Funktion verwenden?

+0

Es ist nicht.Es ist ein Array (oder sollte angenommen werden) FIXED – FuckYou

+0

Nicht das Problem, und Sie haben die Frage nicht verstanden, weil, wenn ich festgestellt habe, dass ich das Ergebnis durch direkte Einbeziehung erhalten kann Offensichtlich ist das Array ein Array und wurde hier nur als Halter platziert, als wäre es bereits definiert worden. Wie auch immer, danke. Ich habe diese – FuckYou

+1

aktualisiert Die 'richtige' Antwort, würde sein, das Array in die Klasse über einen Konstruktor zu übergeben ... aber globale $ -Produkte; an der Spitze der Datei, wo Sie $ Produkte verwenden, wird funktionieren .... JEDOCH ist das sehr sehr verpönt - und ich hasse mich selbst für das Vorschlagen !!! – Brian

Antwort

3

Nun, wenn Sie für globals fahren dann scheint es, dass die andere Antwort immer $products verwenden würde. Hier ist eine dynamische Art und Weise, so dass Sie 'user' und $users (hinzugefügt a ‚s‘) passieren könnte, wäre verfügbar etc ...

Class Example{ 
    public function Template($root){ 
     ${$root.'s'} = $GLOBALS["{$root}s"]; 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

jedoch würden Sie besser dran, die Variable vorbei und mit einem Standard-Namen innerhalb die Funktion, $data in diesem Fall und alle Vorlagen würden $data verwenden:

Class Example{ 
    public function Template($root, $data){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

$products = array("garbage"); 
$test = new Example; 
$test->Template("product", $products); 

Wenn Sie wirklich einen bestimmten Namen wie $products aus irgendeinem Grund brauchen, dann betrachten sie als assoziatives Array übergeben:

+0

yep wie ich in einem Kommentar unter der anderen Antwort angegeben –

1

Ihr Problem ist, dass Ihre Variable $ product im globalen Gültigkeitsbereich definiert ist und Sie eine Datei in eine Funktion einschließen. Die Datei verweist also auf eine $ product-Variable aus dem lokalen Bereich der Funktion.

versuchen, dieses:

Class Example{ 
     public function Template($root){ 
      global $products; 
      include ROOT."/templates/{$root}.php"; 
     } 
    } 
+0

Vielen Dank für Ihre Antwort! Brian oben sagte, dass dies verpönt ist, kann jemand näher auf warum? – FuckYou

+0

http://stackoverflow.com/questions/8715897/why-is-it-consided-bad-practice-to-use-global-referenz-inside-functions – Brian

+1

Das ist wegen der Variablen Bereich. Jede Variable befindet sich im lokalen Bereich eines Bereichs. Die im globalen Geltungsbereich definierten Variablen sind globale Variablen. In internen Funktionen wird der globale Gültigkeitsbereich jedoch durch den lokalen Gültigkeitsbereich geändert, und auf die globalen Variablen kann erst zugegriffen werden, wenn Sie die Verwendung einer Variablen des globalen Geltungsbereichs deklariert haben. –

Verwandte Themen