Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2011, 10h12   #1
Membre du Club
 
Inscription : mars 2008
Messages : 274
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 274
Points : 50
Points : 50
Par défaut [POO]Problème avec une méthode statique

Bonjour/ bonsoir,

J'ai le code suivant:
Code :
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:
Citation:
Fatal error: Using $this when not in object context...
qui correspond à l'appel de la méthode getListeFamilles() dans setListeFamilles()
Pourquoi ?
merci,
yann18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 10h34   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
y'ap s de $this en static que du self (ou static)
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 10h37   #3
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
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.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 13h53   #4
Membre du Club
 
Inscription : mars 2008
Messages : 274
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 274
Points : 50
Points : 50
Oui, je pense. C'est pourquoi dans le code secondaire, j'avais bien écrit
Code :
Static_Class::setListeFamilles();
Il y a quelque chose qui m'échappe...
yann18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h28   #5
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
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 :
1
2
3
public static function setListeFamilles() {
        self::getListeFamilles();
    }
ou encore
Code :
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.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 17h48   #6
Membre du Club
 
Inscription : mars 2008
Messages : 274
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 274
Points : 50
Points : 50
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 !
yann18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 19h32   #7
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Salut,

Tu peux conserver cette approche (static) en modifiant un peu ta classe :
Regardes :
Code :
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h23.


 
 
 
 
Partenaires

Hébergement Web