2011-01-13 13 views
62

Sto provando a passare una variabile da un file di inclusione a un altro. Questo NON funziona a meno che non dichiari la variabile come globale nel secondo file di inclusione. Tuttavia, NON è necessario dichiararlo come globale nel file che chiama la prima inclusione. Ad esempio:Passaggio di una variabile da un file di inclusione di php a un altro: globale vs. non


front.inc:

$name = 'james'; 

index.php:

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

uscita: James


e nd.inc:

echo $name; 

uscita: niente


SE Dichiaro nome globale $ prima echeggiando $ nome in end.inc, allora funziona correttamente. La risposta accettata a questo post spiega che questo dipende dalla configurazione del server: Passing variables in PHP from one file to another

sto usando un server Apache. Come dovrei configurarlo in modo che dichiarare che $ name sia globale non è necessario? Ci sono vantaggi/svantaggi rispetto all'uno o all'altro?

+2

include non sono come funzioni. include non rompere l'ambito della variabile. è come se copiassi il contenuto del file include direttamente nello script chiamante. – dqhendricks

+2

è l'eco in end.inc all'interno di una funzione? – dqhendricks

+2

che interromperà l'ambito della variabile. e in tal caso dovresti probabilmente passare $ name alla funzione in un argomento. – dqhendricks

risposta

52

Quando compresi i file in PHP, si comporta come il codice esiste all'interno del file che vengono inclusi da. Immagina di copiare e incollare il codice all'interno di ciascuno dei tuoi file inclusi direttamente nel tuo index.php. Ecco come funziona PHP include.

Quindi, nel tuo esempio, dal momento che hai impostato una variabile chiamata $name nel file front.inc, e quindi inclusi sia front.inc e end.inc nel vostro index.php, si sarà in grado di echo variabile $name ovunque dopo la include di front.inc all'interno del tuo index.php. Ancora una volta, PHP elabora il tuo index.php come se il codice dei due file che stai includendo sia parte del file.

Quando si posiziona un echo all'interno di un file incluso, in una variabile che non è definita all'interno di sé, non si otterrà un risultato perché viene trattato separatamente da qualsiasi altro file incluso.

In altre parole, per fare il comportamento che ti aspetti, è necessario definirla come un globale.

+34

La tua risposta sembra contraddire se stessa. Hai detto un paio di volte che includere un file è come se tutto il codice fosse semplicemente parte di un file. Pertanto, ciò che ho descritto nel mio post sarebbe equivalente a: $ name = 'james'; echo $ nome; echo $ nome; - Dovrebbe produrre jamesjames. Ma il tuo penultimo paragrafo contraddice ciò che ho appena descritto. Forse quello che intendi è che SOLO il file che fa la chiamata include ha accesso alle variabili del file incluso, quindi gli altri file inclusi NON hanno accesso a quelle variabili. È corretto? – maxedison

+18

Sì, sembra corretto. Scusa se io quello che ho detto è stato confuso. L'ho modificato 5 volte perché stavo avendo davvero difficoltà a descrivere il processo senza farti perdere. Pertanto, il file principale ha accesso alle variabili in entrambi i file inclusi, ma il file incluso non ha accesso all'altro file incluso. Se questo ha un senso. –

+0

perfetto. grazie michael – maxedison

25

Ecco una trappola da evitare. Nel caso in cui sia necessario accedere alla variabile $ nome all'interno di una funzione, è necessario pronunciare "nome $ globale;" all'inizio di quella funzione. È necessario ripetere questo per ogni funzione nello stesso file.

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

function foo() { 
    echo $name; 
} 

function bar() { 
    echo $name; 
} 

foo(); 
bar(); 

mostrerà solo errori. Il modo corretto per farlo sarebbe:

include('front.inc'); 

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

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

foo(); 
bar(); 
+0

Funziona perfettamente –

+0

In altre parole: scrivi 'global $ var' prima di usarlo in un'altra funzione. –

-10

Ho una strana soluzione. nel file end.inc, aggiungere questa riga:

$name=$name; 

Poi l'eco avrebbe funzionato.

Ho trovato questa soluzione nel mio progetto, senza una buona spiegazione del perché ha funzionato in questo modo.

+2

Probabilmente hai avuto un errore di battitura. – Aziz

+0

in realtà ho visto accadere questo. Quasi la situazione esatta. include ('data.php'); [$ action = 'accedi';] echo $ action; niente ha funzionato, abbastanza stranamente $ azione = $ azione; echo $ action lo ha risolto. Si scopre che si è verificato un problema di buffering in php per qualche motivo. I miei file dove solo a lungo. –

+0

Wowee, c'è un sacco di downvotes su questo ragazzo. Probabilmente dovresti darci le circostanze in cui questo è accaduto, o almeno spiegare, perché questa risposta non è così utile a qualcuno che non si rende conto di quello che sta succedendo. –

-2

Questo è tutto quello che dovete fare:

In front.inc

global $name; 
$name = 'james'; 
+0

Aggiungere una spiegazione con la risposta per come questa risposta aiuta OP nel risolvere il problema corrente –

+0

Ho avuto lo stesso problema come descritto da maxedison. Sono stato anche confuso con molte risposte: "processo php include come copia e incolla ..." che non è vero e grazie alla spiegazione di Michael sotto la sua risposta capisco che il codice nel file incluso non riconosce la variabile globale definita nel precedente file include .Nei miei esperimenti ho anche incontrato il fatto che se uso la parola chiave "globale" nel primo iclude posso correggere questo - come rispose Paul. Ma dove posso trovare entrambi i casi descritti nella documentazione di PHP? E la seconda domanda è se entrambi non sono veri solo da qualche versione di PHP? – StackPeter

Problemi correlati