Newsgroup: it.comp.www.php
Titolo: Scope variabili e come si evita di includere più volte un file

Ciao a tutti, in una pagina XHTML ho incluso del PHP e ho qualche 
problema nel richiamare da una funzione, presente in un file A incluso 
nel codice XHTML, una variabile definita in un altro file B sempre 
incluso nel codice XHTML ma non nel file A. Però il file B è incluso nel 
mio file .html subito prima del file A quindi a livello logico pensavo 
che l'interprete PHP lavorasse con il file .xthml dopo avervi incluso 
tutti i file citati nelle funzioni "include()".
Come posso fare?
Praticamente nel file .html chiamo:
include("./include/config.inc.php");
include("./include/top_foot.inc.php");
funzione_definita_in_top_foot.inc.php();
Ecco l'inizio del file top_foot.inc.php:
<?php
  function top() { ?>
   <?php
    echo "<div id=\"header\"><a href=\"{$mio_dominio}/abc.php\" 
id=\"top_header\" name=\"top_header\">prj</a></div>"
   ?>
  <? }
  [..]
{$mio_dominio} è definita nel file config.inc.php e non viene vista 
nella funzione top().
Che devo fare perchè tale variabile venga vista all'interno di quella 
funzione?
Pensavo magari di includere config.inc.php con "include()" anche nel 
codice del file top_foot.inc.php ma avrò poi problemi di doppia 
inclusione come in C? In tal caso devo ovviare a tale problema (tipo con 
gli #ifndef del C) per potere rendere visibile il contenuto di quel file 
anche da quella funzione?
Attendendo una risposta vado a ripassarmi lo scope delle variabili in 
PHP... :=)
  ciao e grazie anticipatamente per le risposte!!

 nella funzione top().
<?php 
$mio_dominio = '
dwebpro.com
';
function top() { 
	global $mio_dominio;
	echo $mio_dominio;
}
top();
?>
Comunque como soluzione non e' il massimo dal punto di vista del design.
In alternativa puoi utilizzare una costante al posto di una variabile.
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 nella funzione top().
Ti stai pericolosamente avvicinando alle variabili globali. :P
E in piu` stai mischiando PHP e HTML veramente male.
I miei consigli:
- non usarle le variabili globali, o usale il minimo indispensabile. Nel 
file config.inc.php definisci un array per la configurazione (a meno che 
non vuoi passare a qualcosa di piu` avanzato come una classe apposita).
Ti troverai quindi $config["mio_dominio"] nel resto del programma.
- passa alle funzioni i parametri che devono usare, senza contare sulle 
variabili globali, tranne, proprio tirata tirata, in casi come quello 
sopra, ma solo DOPO che avrai raggruppato tutto in un array. E rendi 
globale SOLO la configurazione del sito. Non farti indurre in tentazione 
con altre variabili. Per esempio puoi fare:
<?php
 function top($conf) {
   ?>
     <div id="header"><a href="<?php echo $conf["mio_dominio"]; ?>"/
abc.php" ...> ... </div>
   <?php
 }
?>
che richiamerai con top($config);
... oppure ...
<?php
 function top() {
   global $config;
   ?>
     <div id="header"><a href="<?php echo $config["mio_dominio"]; ?>"/
abc.php" ...> ... </div>
   <?php
 }
?>
- per includere un file una volta sola puoi usare include_once() (e 
smazzarti i warning nel caso non esista) o require_once() (che blocca lo 
script nel caso il file non esista). Usale dappertutto e, se il file e` 
gia` incluso, non verra` re-incluso.
Ma in questo caso, dopo aver capito lo scope, non dovrebbe servirti.
Bye.

 
Il problema è che così perdo la praticità di avere un solo file "di 
configurazione". Il file di configurazione incluso nell'html con 
l'istruzione php "include("./include/config.inc.php");" deve essere 
l'unico file in cui imposto il nome del dominio.
Non vorrei impostarlo anche nel file con le funzioni per costruire 
top_header e footer, perderei la praticità di configurare un solo file.

mrzac ha scritto:

Mi sembra che tu non abbia compreso il significato dell'esempio.
Se al posto di:
	$mio_dominio = '
dwebpro.com
';
scrivi:
	include(dirname(__FILE__) . "/include/config.inc.php");
ed all'interno di config.inc.php scrivi:
	$mio_dominio = '
dwebpro.com
';
ti renderai conto che l'esempio risolve il tuo problema attraverso
l'utilizzo del costrutto global all'interno della funzione top().
Tieni bene a mente quanto scritto da Alessandro in merito ai problemi
sollevati da un approccio come il tuo.
IMHO dovresti provare uno dei tanti template engine disponibili, visto
che sono fatti apposta per separare la logica applicativa dalla layer
di presentazione (es. HTML etc.).



Riletto dopo questi giorni di pratica la pagina del manuale sullo scope 
( 
http://www.php.net/manual/en/language.variables.scope.php
 ) e ora mi è 
tutto più chiaro rispetto a prima.
MI CHIEDEVO soltanto se l'usare "global", per vedere in una funzione una 
variabile definita all'esterno di essa, richiedesse o meno di abilitare 
il supporto delle variabili globali tramite php.ini e quant'altro...
  ciao e grazie del supporto!
-- 
(Freedom for Burma)

 il supporto delle variabili globali tramite php.ini e quant'altro...
No, altrimenti global non servirebbe a niente.
Non abilitare mai per nessun motivo register_globals in php.ini.
Bye.