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 :

portée "globale" d'une variable


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut portée "globale" d'une variable
    Bonsoir,

    mon objectif est de pouvoir affecter une valeur à une variable en un endroit d'un script et que cette variable soit accessible à un autre endroit de ce script, et au cours d'un autre appel de ce script.

    Ayant déjà vu que la rendre global était mal, j'ai cherché une autre solution :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function setOrGetMessage($value){
        static $message = "";
     
        if ($value == "")
            return $message;
        else {
            $message = $value;
        }
    }

    Donc pour affecter une valeur à la variable $message, on peut faire setOrGetMessage('my_value'); et pour en afficher la valeur echo(setOrGetMessage(''));. La portée static de la variable doit rendre pérenne sa valeur lors d'un autre appel du script (à l'instant t1, j'exécute le script et mets la variable à la valeur value1 puis je sors du script, puis le réexécute ; la variable a gardé sa valeur value1 que je peux afficher en faisant t2 echo(setOrGetMessage(''));).

    Mon idée échoue, vu que quand j'affiche la valeur de la variable, elle est toujours nulle alors que je l'ai déjà mise à une valeur non nulle.

    Comment je le vérifie ?

    J'ai un peu modifié la fonction :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function setOrGetMessage($value){
        static $message = "empty";
     
        if ($value == "")
            return $message;
        else {
            $message = $value;
        }
    }

    Lors d'un appel du script, je modifie la valeur de la variable : setOrGetMessage('Vous devez saisir le nom d\'une ville.');. Lors d'un second appel du script, j'affiche la valeur de la variable : echo(setOrGetMessage('')); mais celle-ci vaut encore empty. Sa valeur n'a donc pas été modifiée.
    Quelle est l'erreur, SVP ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Ceci pourrait peut-être aider?
    https://www.php.net/manual/en/function.msg-receive.php

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse.
    En attendant, je suis parti sur une solution à base de POO. Mais c'est pas encore au point :

    msg.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    namespace dvp;
     
    class msg
    {
        public static $msg = "";
     
     
        static public function setMsg($value){
            self::$msg = $value;
        }
     
        static public function getMsg(){
            return(self::$msg);
        }
    }

    search.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
      use dvp\msg;
    ...
    msg::getMsg();  //ici la ligne 68
    ?>

    Fatal error: Uncaught Error: Class "dvp\msg" not found in C:\projets\dvp\divers\dvp\search.php:68 Stack trace: #0 {main} thrown in C:\projets\dvp\divers\dvp\search.php on line 68
    Je ne comprends pas pourquoi il ne trouve pas la classe...(je suis en local)

  4. #4
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Vous voulez que la variable dure pendant toute la session de l'utilisateur si c'est le voir avec les variables de session $_SESSION

  5. #5
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 351
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Le mot clé static ne permet pas de persister une données entre plusieurs appels.
    En POO, le mot clé static permet de définir dans une classe des méthodes ou propriétés statiques qui pourront être utilisées sans instancier un objet de la classe : https://www.php.net/manual/fr/language.oop5.static.php

    Pour persister une données entre plusieurs appels, il faut effectivement se tourner vers les variables de session ou un autre moyen de stockage (bdd, fichier, etc.).

    Concernant l'erreur fatale, il faut faire un require de la classe msg.php pour pouvoir l'utiliser dans search.php (ou utiliser un autoload).

    Bonne journée,

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Il faut bien comprendre qu'une fois l'execution de ton code terminé , plus rien n'existe.
    il est donc normal que quand tu exécute une seconde fois ton script , la variable n'a plus sa valeur.

    Contrairement à un applicatif plus classique où le code exécuté peux vivre en permanence , le context d'exécution ne survie que le temps d'execution du code , rien de plus.

    La solution à ton problème c'est :
    * Ecrire la valeur dans un fichier => Si cette valeur est identique pour tous les utilisateurs. (Attention aux risque d'accès concurrent, si bcp sollicité)
    * Ecrire en session => Si différent pour chaque utilisateur et durée de vie limité à la session
    * Ecrire en bdd => Si différent pour chaque utilisateur et durée de vie longue.

  7. #7
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par Pytet Voir le message
    ...
    Pour persister une données entre plusieurs appels, il faut effectivement se tourner vers les variables de session ou un autre moyen de stockage (bdd, fichier, etc.).
    ...
    +1 : Bdd

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par grunk Voir le message
    Il faut bien comprendre qu'une fois l'exécution de ton code terminé , plus rien n'existe.
    J'ai beau le savoir, je m'étais fait avoir, et c'est aussi la raison qui fait que ma "solution" en POO échouait. J'avais en tête une application où on faisait des includes et donc on ne sortait jamais du script et là, bien sûr, ce n'est pas le cas.

    Comme pas besoin de conserver longtemps l'information, j'ai opté pour la solution à base de session :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function setOrGetMessage($value){
     
        if ($value == "")
            return $_SESSION['message'];
        else {
            $_SESSION['message'] = $value;
        }
    }

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if (empty($ville_nom)) 
        {
            setOrGetMessage('Vous devez saisir le nom d\'une ville.');
        }

    et en fin de script :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    echo setOrGetMessage("");

  9. #9
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 785
    Points : 3 048
    Points
    3 048
    Par défaut Clean code
    J'ai un peu de mal avec ta fonction "setOrGetMessage"; normalement tu as une fonction dite "setter" pour initialiser une variable une autre seconde fonction dite "getter" pour récupérer la valeur. Ici, tu fais les deux dans la même fonction, c'est ... étrange.

    J'ai l'impression dans ton exemple que la bonne approche serait d'avoir une variable de type array qui, à l'entrée du code, serait initialisée à un tableau vide.

    Puis, quand tu vas faire tes contrôles (est-ce que le prénom est correctement complété, le nom, la ville, la date de naissance, ...); tu ferais appel à une fonction "addErrorMessage" qui se chargerait d'ajouter un élement dans le tableau.

    À la fin du code, tu aurais un displayErrormessages() qui ferait une boucle sur le tableau et en afficherait les erreurs s'il y en a càd si le tableau n'est pas vide.

    Peu importe les noms des fonctions mais tu aurais alors une approche plus claire : une fonction pour l'ajouter d'un message d'erreur dans le tableau et une seconde fonction pour leur affichage. Le code gagnerait en clarté et en efficacité puisque, grâce au tableau, on pourrait afficher plusieurs messages (le prénom, le nom, ...) et pas juste la dernière erreur rencontrée.

    En programmation, il faut éviter d'avoir une même fonction qui fait deux choses totalement différente (ton cas avec set or get).

    Un autre exemple ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    function getValue(bool $returnName): string
    {
        if ($returnName) {
            return "Nom";
        } else { 
            return "Prénom";
        }
    }
     
    echo '<h1>' . getValue(false) . '</h1>';
    Autant avoir une fonction getFirstName et une autre getLastName.

    Le fait d'avoir un boolean comme paramètre pour une fonction est un indicateur que la fonction fait deux choses (selon qu'il est true ou false) et, généralement, cela veut dire qu'il faudrait écrire deux fonctions.

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Salut,
    OK, j'ai splitté ma fonction unique en 2 fonctions qui ont chacune un seul rôle, par contre pas de fonction "addErrorMessage", car pour "saisir" une donnée, il n'y a qu'une liste déroulante. Cela dit, j'espère me souvenir de ta remarque quand le cas se présentera...(ce qui dans mon cas assez peu probable (mémoire archi-nulle ))

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function setMessage($value){
       $_SESSION['message'] = $value;
    }
     
    function getMessage(){
       return($_SESSION['message']);
    }
    ...
    setMessage('Vous devez saisir le nom d\'une ville.');
    ...
    echo getMessage();

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/05/2020, 12h07
  2. Réponses: 3
    Dernier message: 04/02/2019, 13h53
  3. Problème de quote dans une variable
    Par hvincent dans le forum Développement
    Réponses: 3
    Dernier message: 06/09/2018, 09h41
  4. [AC-2002] Quotes dans une variable
    Par Domi2 dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/06/2009, 16h51
  5. quotes dans une variable
    Par requiemforadream dans le forum ASP
    Réponses: 3
    Dernier message: 09/05/2005, 09h55

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