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 :

Variable de classe (statique) non affectée [POO]


Sujet :

Langage PHP

Vue hybride

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 499
    Billets dans le blog
    1
    Par défaut Variable de classe (statique) non affectée
    Bonjour,

    il s'agit très probablement d'un bogue, mais je ne vois pas...

    D'abord, j'appelle une première méthode de ma classe qui affecte une variable statique :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class LDispListApp
    {
        static string $appli_key;
     
        public function invoke()
        {  
            self::$appli_key = $_POST['list']; 
            etc
        }
    }
    Ailleurs, je souhaite récupérer cette variable :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ref_ldisplistapp = new LDispListApp();
    $appli_key = $ref_ldisplistapp->getAppliKey();
    Dans la classe LDispListApp, on a :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public function getAppliKey()
        {
             echo " appli_key (static) =".  self::$appli_key;
            return self::$appli_key;
        }
    Je m'attend donc à récupérer la valeur que j'avais affectée préalablement. Cependant,
    Error: Typed static property ticket_rawsrc\controller\license\display\LDispListApp::$appli_key must not be accessed before initialization
    Peut-on me dire pourquoi ?

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pourquoi vouloir lire ou écrire un membre static via des méthodes qui ne le sont pas ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronné Avatar de Freudd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 165
    Par défaut
    Bonjour laurentSc,

    La méthode __invoke() est appelée lorsqu'un script tente d'appeler un objet comme une fonction.

    Essaye ça pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ref_ldisplistapp = new LDispListApp();
    $ref_ldisplistapp ();
    $appli_key = $ref_ldisplistapp->getAppliKey();

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 499
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Freudd Voir le message
    Essaye ça pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ref_ldisplistapp = new LDispListApp();
    $ref_ldisplistapp ();
    $appli_key = $ref_ldisplistapp->getAppliKey();
    Je viens d'essayer :
    Error: Function name must be a string in C:\projets\ticket_rawsrc\model\license\LicenseData.php on line 27
    Du coup, j'ai modifié le code : lDisplistapp (); //nom de la classe mais
    Error: Call to undefined function ticket_rawsrc\model\License\lDisplistapp() in C:\projets\ticket_rawsrc\model\license\LicenseData.php on line 27
    Le nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        public function invoke()
    (pas __invoke) est utilisé par mon routeur qui suppose l'existence d'une telle méthode :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $controller = new $routes[$action]; 
    $controller->invoke($data);

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 499
    Billets dans le blog
    1
    Par défaut
    Je reviens sur ce problème. Utiliser une variable statique n'est peut-être pas une bonne idée mais je n'en ai pas trouvée d'autre.

    Revenons sur ce que je veux faire.
    D'abord, l'utilisateur choisit une application. Donc il a formulaire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <form method="post" action=" ?action=DispListApp">
        <select name="list" onChange="this.parentNode.submit()"> 
            <option value="">Please select an application</option>
            etc

    L'action va être gérée par le routeur (il s'agit d'une architecture MVC) qui va appeler la méthode invoke de la classe LDispListApp. C'est dans cette classe que je mémorise le nom de l'application (pour l'instant dans une variable statique) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class LDispListApp
    {
        static string $appli_key;
     
        static function invoke()
        {  
            self::$appli_key = $_POST['list'];

    Ensuite, j'interroge la bdd pour recueillir les informations relatives à cette application. Ceci va être la responsabilité d'une autre classe (LicenseData). La méthode de LicenseData qui va faire ça doit donc récupérer l'information relative à cette application. Le souci est que comme c'est le routeur qui va instancier la classe LDispListApp, on ne peut pas mémoriser le référent vers cette classe, d'où l'idée d'une variable statique.
    Peut-on faire autrement ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 499
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Peut-on faire autrement ?
    Oui avec une variable de session...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class LDispListApp
    {
        function invoke()
        {   session_start();
            $_SESSION['appli_name'] = $_POST['list']; 
            ...
    et dans licenseData.php
    public function SendDataToDisplay($sesa):array
        { 
            session_start();
            ...
            $appli_name = $_SESSION['appli_name'];

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 499
    Billets dans le blog
    1
    Par défaut
    OK, je comprend le problème. Par contre, j'ai rendu statiques les 2 méthodes :
    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
    class LDispListApp
    {
        static string $appli_key;
     
        static function invoke()
        {  
            self::$appli_key = $_POST['list']; //qui vaut ici "appli2"
            etc
        }
    }
     
    static function getAppliKey()
        {  
            echo " appli_key (static) =".  self::$appli_key;
            return self::$appli_key;
        }

    mais l'erreur reste :
    Error: Typed static property ticket_rawsrc\controller\license\display\LDispListApp::$appli_key must not be accessed before initialization in C:\projets\ticket_rawsrc\controller\license\display\LDispListApp.php on line 44
    Cette ligne 44 correspond ici à la ligne 14.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/06/2009, 15h14
  2. Réponses: 2
    Dernier message: 06/03/2009, 09h52
  3. Réponses: 7
    Dernier message: 22/10/2008, 10h14
  4. Réponses: 27
    Dernier message: 03/01/2008, 11h07
  5. Variable de classe véritablement statique ?
    Par thomzon dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 15h39

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