IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Variables globales et include() [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut Variables globales et include()
    Bonjour,
    j'ai un petit souci que je n'arrive a résoudre...
    Voici le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $a = "toto";
    function afficheA(){
      global $a;
      echo $a;
    }
    include("a.php");
    Le fichier a fait lui un appel a afficheA(), mais impossible de récupérer le "toto".

    Avez vous une idée du pourquoi?

    Merci

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Le fichier a fait lui un appel a afficheA(), mais impossible de récupérer le "toto".
    D'accord, mais qui a t-il dans a.php ?
    Si dans a.php il y a un code qui réinitialise la variable $a (genre $a = ''), la chaine sera vide, et donc le echo retournera rien, visuellement rien.

    Petit essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ma_variable = "toto";
    function afficheA(){
      global $ma_variable;
      echo $ma_variable;
    }
     
    afficheA(); // doit afficher : toto
    Ici, tu dois voir : toto
    Cet exemple doit confirmer que c'est a.php qui cause problème.

    Mais un conseil, évite les noms aussi simpliste que $a, utilise un nom du genre $ma_variable, même pour un essai bidon.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    En fait, le code que j'ai mis est un exemple. Mon code est beaucoup plus complexe que ça, avec pas mal de niveau d'include, et ma variable ne s'appel pas $a. J'aurait du le préciser mais le bout de code que j'ai mis est déjà dans un fichier include, et même dans un if().

    J'ai contourné le problème avec $GLOBALS['a'] (a étant encore une fois un exmple )

    Merci tout de même.

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    J'ai contourné le problème avec $GLOBALS['a'] (a étant encore une fois un exmple )
    Ok, je m'en doutais un peu

    N'empêche que contourner avec un $_GLOBAL ne résout pas ton problème, il doit avoir erreur quelque part dans tes includes.
    Un problème de portée/visibilité de cette variable peut être ?

    Faire une recherche de toute les occurrences de $a pour suivre son évolution devrait mener à un moment ou celle ci ne contient pas la valeur attendue.

    Essai avec un var_dump($a) (qui donne des infos plus complète) plutôt qu'un echo.


    A coté de ça, si tu donne un code assez éloigné de la réalité, comment veux tu qu'on puisse comprendre le nature de ton erreur ? (A part avoir des dons de voyance )

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    A coté de ça, si tu donne un code assez éloigné de la réalité, comment veux tu qu'on puisse comprendre le nature de ton erreur ? (A part avoir des dons de voyance )
    C'était pour pas surcharger le post, mais si tu en redemandes

    Alors en fait, j'utilise une réécriture d'url perso : dans le .htaccess, je redirige tout vers un fichier index.php
    Celui ci fait l'include du bon fichier si possble, ou demande authentification, etc...
    dans le fichier inclus, je fais en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    if(cond){
      $a = "un champ venant de mysql";
      function afficheA(){
        global $a;
        echo $a;
       }
      include("fichierquiappelafficheA.php"); //le head de ma page
      //plein d'autre code
    }
    else{
       function afficheA(){  }
       include("fichierquiappelafficheA.php");
       //un message d'erreur, mais on affiche quand meme l'entete
    }
    Et très sincèrement, l'appel a afficheA est au début de fichierquiappel[...], et rien ne peux l'avoir modifier, à priori. J'ia essayer pleins de nom de variables.
    Je pense que ça vien de mon contexte, mais bon... Existe il une vraie différence entre $GLOBALS['a'] et global $a ?

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Existe il une vraie différence entre $GLOBALS['a'] et global $a ?
    Oui, car $_GLOBAL permet d'accéder à toutes les variables à partir du moment où elles existent, où elles ont été créés, et cela n'importe où dans le code.

    Un global ne rendra la portée de la variable en global uniquement au moment où déclaration est faite, et uniquement où la déclaration se trouve (fonction/méthode de classe).
    C'est tout de même très différent.

    Déjà que déclarer un variable en global dans une fonction complique le suivi de l'évolution de la valeur d'une variable, mais le faire au travers du tableau super global $_GLOBAL complique encore plus les choses. Le genre de truc qu'il vaut mieux éviter à mon sens.

    Ton problème vient très certainement de là où sont déclarés tes 2 fonctions.

    Vu comment tu as organisé ça, et bien 2 remarques (personnelles, à toi de voir).
    La 1ère c'est qu'il est inutile de déclarer (ou créer) des fonctions dans des includes, c'est franchement pas une bonne pratique.
    Le plus simple c'est de créer un fichier genre fonctions.php et on y mets toutes ces fonctions, et uniquement des fonction et on l'inclus dans sa page au tout début.
    A ce moment, les fonctions sont dispos, prêtent à être exploitées, appelées.

    La 2ème, et bien vu que tu as 2 déclarations de la même fonction, ça sous entend que le code dans ces 2 fonctions seraient différents.
    -> Si les codes sont différents, alors cela doit déboucher sur 2 fonctions différentes, 2 noms différents.
    Ensuite ont appel la bonne fonction selon le contexte/conditions.
    -> Si le code, les traitements sont les même, alors il est inutile voir risqué de les déclarer (ou créer) 2 fois, même dans 2 conditions différents.

    Au vu de ton code, on dirais que tu ne fais pas la différence entre la déclaration (ou création) d'une fonction et l'appel à cette fonction, ce qui est très différent.


    Donc place/déclare cette fonction 1 seule fois (si c'est bien la même) et au tout début de ta page.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Si si je fais parfaitement la différence. En fait, ce qu'il se passe, c'est que cette fonction permet d'ajouter du code (html/js) dans l'entete de la page. Cette entete n'est pas la même suivant la page ou on se trouve. Mais toutes les pages font un include d'un head.php, qui génere l'entete du fichier html (bannière, <link>, <script>, doctype...).

    Une autre solution aurait été de générer une chaine (dans une variable) et d'en faire un echo dans le head... mais j'ai choisi de déclarer une fonction qui affiche bien ce que l'on veut, en fonction de la page. Le développement étant bientôt terminé, je ne vais pas tout changer, mais il est vrai que la conception n'est surement pas au top. Je n'avais pas prévu que cette fonction ai besoin de paramètres (c'est le seul endroit ou j'ai ce problème)

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par theanthony33 Voir le message
    Si si je fais parfaitement la différence.
    Tu m'excuseras, mais j'en doute, car tu n'aurais pas fais ainsi.

    Un codeur ne déclarera jamais 2 fois une même fonction (même nom) pour la simple raison que Php ne permet pas de le faire, cela débouche sur une erreur.
    Si on le fait, on prend obligatoirement le risque d'avoir une erreur.

    Donc bis et repetitas :
    - Soit les traitements sont les mêmes, du coup la déclarer 1 seule fois suffit et on prend 0 risque d'avoir une erreur de retournée, et pour ça faut au moins la remonter avant le if() (la condition).
    L'affaire sera réglé.
    - Soit les traitement sont différents, dans ce cas il faut créer 2 fonctions, 2 noms différents, et on appel la bonne selon la ou les condition.
    Avec une bonne fonction de recherche de son éditeur ça peu ce faire en quelques minutes, guère plus.

    Fais juste un essai en déclarant une fonction de Php existante (avec mysql_connect par exemple)


    Les explications que tu donne n'ont aucun rapport avec le comportement de ci dessus.
    A mon sens il y a des trucs qui t'échappe, et tu as encore sous le coude un problème de portée/visibilité avec ta variable $a.
    Ton problème n'est pas résolu, juste contourné comme tu l'as précisé.


    Maintenant, si tu estime que cela te conviens, et résolu, et bien soit

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Un codeur ne déclarera jamais 2 fois une même fonction (même nom) pour la simple raison que Php ne permet pas de le faire
    Tu a un contre exemple Tu as l'aire de penser que je suis un débutant, c'est pas "tout a fait" le cas

    Je ne la déclare pas 2 fois, je la déclare d'une façon ou d'une autre. Je suis bien conscient que ce n'est pas propre, mais c'est la façon que j'ai trouvé pour contourner un problème de conception qui date de plusieurs mois. Elle est certes pas idéale.

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je ne la déclare pas 2 fois, je la déclare d'une façon ou d'une autre
    Et bien si, peu importe que ce soit dans une alternative, elle y est 2 fois dans ton code, donc 2 déclarations.


    Tu n'est certainement débutant, j'en conviens, mais il y a au moins un aspects qui t'échappe.
    T'aurais donné 2 noms différents, ça aurait été un peu plus propre.
    Puis si je vois quelque chose qui me semble pas cohérent, j'en fais la remarque.
    Après ça, chacun fait comme il veut, soit on y voit matière à améliorer son code, soit on n'en tient pas compte, c'est Open ... Source ...


    Le fait de créer 2 fois une même fonction (même nom) dans son code, même dans une alternative, est un non-sens, il n'y a pas à faire ainsi, faut en convenir.
    C'est la fonction qui doit répondre au besoin du contexte, mais pas l'inverse.
    Si le contexte est très différent et qu'il sera difficile d'en faire qu'1 seule, et bien, on en créer une 2ème, ou 3, etc ...
    De tout manière, le fait de créer 2 fois la même fonction dans une alternative revient à avoir 2 fonctions. Autant les créer ces 2 fonctions, cela va éliminer obligatoire une éventuelle erreur de double déclaration.

    Une fonction (comme une classe) peut être créé/déclarée aussi bien à la 1 ligne de code d'une page tout comme à la dernière ligne, du coup, et bien autant le faire dès le début, ce qui évitera des éventuels problèmes.

    Par convention, ou par commodité, pour structurer/organiser un projet, en général on rassemble toutes ces fonctions dans un ou plusieurs fichiers, idem pour les classes.
    Ensuite, on fait un simple include('mes_fonctions.php') dans sa ou ses pages, dès le début (dans ton head.php par exemple).

    Tu a un contre exemple
    A défaut d'avoir en détail ton code et son déroulement, je ferais ainsi :

    Vu que tu as un head.php qui est inclus dans toutes tes pages, et bien à défaut d'avoir un fichier qui rassemblerait toutes tes fonctions, déclarer/créer ta fonction dans ce head.php serait un compromis.
    Tu vas te rendre compte qu'il ne te seras pas possible de créer 2 fois la même fonction, ceci va t'amener directement à revoir cette fonction.
    Pour éviter de tout reprogrammer, et bien dans un 1er temps créer 2 fonctions.
    Ici, il y aura très peu de modif à faire, faut juste ajuster les appels aux fonctions.

    Dans le head.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    afficheA_cond_1() {
    	global $a;
     
    	//traitements adaptés au 1er contexte
    }
     
    afficheA_cond_2() {
    	global $a;
     
    	// traitements adaptés au 2ème contexte
    }
    Ensuite, dans la page, et selon le contexte, on appel l'une ou l'autre fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (cond) {
    	afficheA_cond_1();
    }
    else {
    	afficheA_cond_2();
    }
    Après, à toi de voir s'il y a moyen d'en faire qu'une seule.

    L'avantage ici (le gros avantage même), c'est que les 2 fonctions pourront être appelées/exploitées n'importe où dans la page, au même titre que toutes les fonctions Php, c'est le but 1er d'une fonction : code réutilisable.

    A l'inverse, l'énorme inconvénient de créer une fonction dans une alternative, c'est qu'elle sera exploitable QUE dans cette alternative.
    Puis si elle est appelée qu'une seule fois, alors il n'y a pas à créer une fonction, là aussi ça n'a pas de sens.
    Aussi, on prend ici le maximum de risque d'obtenir une erreur fatal en Php pour peu que le codeur oubli cette restriction en l'appelant en dehors de l'alternative.
    Je peux difficilement faire mieux comme explication.
    Procéder ainsi c'est une erreur, faut en convenir.



    A coté de ça, rien ne dit que cela va résoudre ton problème.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Je suis entièrement d'accord sur le fait que ça soit crade !

    En gros, il faudrait que je modifie tous mes fichier pour mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str_a_mettre_dans_head = "généré en fontion du contexte"
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function afficheA(){ echo "généré en fontion du contexte"; }
    et remplacer l'appel a afficheA() dans le fichier head par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $str_a_mettre_dans_head;
    Je suis d'accord que ça serait plus claire, mais, ça me fait un paquet de fichier a modifier. Efectivement mes fonction ne sont appelés qu'une fois... Pour info, la fonction afficheA génére le code JS du "<body onload=".

    En tout cas merci pour les conseils

  12. #12
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je suis d'accord que ça serait plus claire, mais, ça me fait un paquet de fichier a modifier. Efectivement mes fonction ne sont appelés qu'une fois... Pour info, la fonction afficheA génére le code JS
    Si les fonctions sont appelés qu'une seule fois, alors il est tout simplement inutile de les créer. Une fonction n'a de sens que si elle est utilisée au moins 2 fois, ou si on projète qu'elle le soit à l'avenir, sinon ça sert à rien, on ne fait que rendre le code plus compliqué, et les risques de plantages qui vont avec.

    Utilise une variable qui évoluera selon les 2 conditions, et au bout un simple echo pour générer le code JS.
    Ici, plus besoin d'exploiter $_GLOBAL (qui n'est pas propre du tout), et tu devrais résoudre le problème de "portée" de cette variable $a.

    Pour modifier une partie de code, même si cela représente beaucoup, l'éditeur de texte est là pour se simplifier la tache.
    Un bon éditeur propose de ressortir chaque ligne de code d'une variable ou fonction (chaque occurrence), soit par un explorateur de code, soit en lançant une recherche sur leur nom.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable globale avec include ?
    Par laloune dans le forum Langage
    Réponses: 3
    Dernier message: 07/07/2012, 19h17
  2. include et variable globale
    Par lilington dans le forum Débuter
    Réponses: 21
    Dernier message: 13/01/2012, 10h39
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 20h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 14h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo