2010-09-23 5 views
0

Je dois inclure des fichiers dans une fonction et les fichiers utilisent beaucoup de variables définies précédemment dans le script. L'utilisation de global n'est pas une option car il est impossible de dire quelles variables seront utilisées dans les fichiers inclus. La seule vraie solution est de rendre toutes les variables globales accessibles en fonction, quelque chose comme:Rendre les variables globales disponibles pour un fichier inclus dans une fonction

 function finc($file) 
    { 

     foreach($GLOBALS as $k=>$v) 
     { 
      $$k=$v; 
     } 
     include $file; 
    } 

mais il ne sera pas bon lorsque vous utilisez beaucoup de fichiers avec beaucoup de variables, donc est-il une meilleure façon de faire il?

+2

@ user410572: « la seule vraie solution est de rendre toutes les variables globales accessibles dans function ": les variables globales sont déjà accessibles dans la fonction. C'est pourquoi ils sont globaux. –

+2

Je commencerais par la cause du problème: il est impossible de dire quelles variables seront utilisées dans les fichiers inclus. Je résoudrais cela en premier, en définissant éventuellement des variables triées sur le volet dans un tableau et en les alimentant en tant que argument à la fonction (en utilisant éventuellement 'extrait' en interne pour l'instant) – Wrikken

+1

@MainMa, ce n'est pas le cas. Vous devez utiliser 'global $ some_global_var' ou' $ GLOBALS ['some_global_var'] 'pour cela. – Lekensteyn

Répondre

0

Il n'y a pas de bonne réponse à ce problème. seulement un conseil. utiliser des objets ... ce que vous faites est possible mais à mon avis une très mauvaise solution car vous définissez tous les globals. il y a cependant un moyen plus efficace de le faire: extract($GLOBALS), mais il serait préférable d'utiliser $GLOBALs['whatever'] dans vos scripts inclus ...

2

Attention: vous importez vraiment toutes les variables globales.

extract($GLOBALS); 
0

Si vous faites cela pour le gabarit, alors vous devez fournir le gabarit seulement un "contexte" , pas toutes les variables globales. Spécifiez simplement un tableau de variables qui doivent être accessibles dans le modèle et extract eux.

Si ce n'est pas templateing ce que vous faites, mais vous routage devriez penser à retourner le nom du fichier à inclure:

include getPathForPage('home'); 
Questions connexes