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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    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
    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.

+ 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, 18h17
  2. include et variable globale
    Par lilington dans le forum Débuter
    Réponses: 21
    Dernier message: 13/01/2012, 09h39
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  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, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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