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 :

[POO]Problème avec une méthode statique [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 295
    Points : 92
    Points
    92
    Par défaut [POO]Problème avec une méthode statique
    Bonjour/ bonsoir,

    J'ai le code suivant:
    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
    16
     
    //$db est une instance de PDO
        public function __construct($db) {
            $this->db = $db;
        }
     
    //    liste les famille de produits
        private function getListeFamilles() {
            $select = $this->db->prepare('select id_fp, famille from famille_prix');
            $select->execute();
            ...
        }
     
        public static function setListeFamilles() {
            $this->getListeFamilles();
        }
    Quand j'appelle la méthode setListeFamilles() dans un fichier secondaire, j'obtiens ce message d'erreur:
    Fatal error: Using $this when not in object context...
    qui correspond à l'appel de la méthode getListeFamilles() dans setListeFamilles()
    Pourquoi ?
    merci,

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    y'ap s de $this en static que du self (ou static)

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    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 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Pour étayer un peu la réponse précédente. $this fait référence à ton instance de classe courante.
    Pour utiliser une méthode statique pas besoin d'instancier la classe , donc $this n'a pas lieu d'être.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 295
    Points : 92
    Points
    92
    Par défaut
    Oui, je pense. C'est pourquoi dans le code secondaire, j'avais bien écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Static_Class::setListeFamilles();
    Il y a quelque chose qui m'échappe...

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    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 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Qu'est ce qui t'échappe ?

    A parti du moment ou ta méthode est static tu peux pas faire référence à l'instance de la classe (this)
    Tu dois donc faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static function setListeFamilles() {
            self::getListeFamilles();
        }
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static::getListeFamilles()
    si jamais le besoin s'en ressent : http://www.php.net/manual/fr/languag...c-bindings.php

    Quoi qu'il en soit dans ton cas ça va te poser problème puisque tu semble avoir initialiser un objet bdd à l'instanciation de ta classe. Objet auquel tu n'auras pas accès dans tes méthode static.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 295
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par grunk Voir le message
    Quoi qu'il en soit dans ton cas ça va te poser problème puisque tu semble avoir initialiser un objet bdd à l'instanciation de ta classe. Objet auquel tu n'auras pas accès dans tes méthode static.
    Oui, il est clair que je ne peux pas envisager la chose sous cette angle.
    Et pour en finir avec cela, getListeFamilles() doit être également en static (?)
    Je pensais malgré tout que PHP était capable d'établir le lien entre une méthode "simple" et static (je ne sais pas si je m'exprime bien). Mauvaise compréhension de ma part...
    merci !

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Tu peux conserver cette approche (static) en modifiant un peu ta classe :
    Regardes :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
     
    class Foo {
     
       /**
        * Renvoie une connexion vers la base de données
        * @return \PDO
        * @static
        */
       static private function pdo() {
          return Cnx::pdo('db_main');
       }
     
       /**
        * @return array
        * @static
        */
       static function getListeFamilles() {
          $select = self::pdo()->prepare('select id_fp, famille from famille_prix');
          $select->execute();
          # ...
       }
    }
     
    ?>
    Tout ce que tu as à faire, c'est d'avoir un classe qui te fournit le PDO au besoin. Ici c'est Cnx::pdo() qui gère toutes mes connexions.
    En plus, très souvent une classe travaille presque toujours sur la même connexion donc l'approche static est plutôt bien vue.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/05/2008, 10h05
  2. [POO] Problème avec une flèche
    Par damienIRIS dans le forum Langage
    Réponses: 12
    Dernier message: 05/03/2008, 14h28
  3. [POO] Problème avec une classe + requêtes sql
    Par mithrendil dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2007, 08h27
  4. Problème avec une méthode virtuelle pure
    Par Burckel dans le forum C++
    Réponses: 4
    Dernier message: 05/12/2006, 13h00
  5. [POO] Problème avec setInterval/méthodes d'écriture
    Par Lpu8er dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/07/2006, 15h37

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