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] [Héritage] Méthode non héritée


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut [POO] [Héritage] Méthode non héritée
    Bonjour, je pose le contexte de mon code.

    J'ai une classe abstraite sqlObject :

    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
    <?php
     
    abstract class sqlObject {
     
    	public function getField($champ) {
     
    		return $this->$champ;
     
    	} // getField
     
    	public static function getAllObjects() {
     
    		global $db
     
    		$sql = "SELECT * FROM ".TABLE_NAME;
     
    		$rows = $db->query($sql);
     
    		return $rows;
     
    	} // getAllObjects
     
    } // sqlObject
    et une classe "Section" qui hérite de la classe sqlObject, dont voici un extrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    class Section extends sqlObject {
     
    	const TABLE_NAME = 'section';
     
    	private $id_section;
    	private $titre_section;
     
    	// [...]
     
    } // Section

    Dans mon code je souhaite récupérer toutes mes "sections" en utilisant une méthode statique héritée de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sections = Section::getAllObjects();
    et j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to undefined method Section::getallobjects()
    La méthode ne semble pas héritée...

    Qu'est-ce qui ne va pas dans mon code ?

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Je suis étonné que dans ton message d'erreur la fonction soit en minuscules... Alors que dans ton test elle contient des majuscules. As-tu bien testé Section::getAllObjects(); et pas Section::getallobjects() ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Certain.

    J'ai mis ma fonction en minuscule dans ma classe pour voir si le problème venait de là mais ça ne change rien. Donc je ne sais pas si le fait que le message d'erreur me donne ma fonction en minuscule ou pas, mais le problème ne semble pas venir de là.

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Pourtant, si j'exécute le code suivant, obtenu après avoir rapidement simplifié le code que tu as fourni, je n'obtiens pas de message d'erreur, et la méthode getAllObjects est bien appelée :
    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
    <?php
     
    abstract class sqlObject
    {
        public static function getAllObjects()
        {
            return 'ok';
        } // getAllObjects
     
    } // sqlObject
     
    class Section extends sqlObject
    {
    }
     
    $sections = Section::getAllObjects();
     
    echo $sections;

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 291
    Points : 15 607
    Points
    15 607
    Par défaut
    essaye ce code seul dans un fichier
    il fonctionne bien chez moi (PHP 5.2.5) et affiche "bon"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    abstract class P 
    {
        static public function s()
        {
            echo 'bon';
        }
    }
     
    class E extends P
    {
     
    }
     
    E::s();

  6. #6
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Citation Envoyé par Eusebe Voir le message
    Je suis étonné que dans ton message d'erreur la fonction soit en minuscules... Alors que dans ton test elle contient des majuscules. As-tu bien testé Section::getAllObjects(); et pas Section::getallobjects() ?
    Les noms de fonctions ne sont pas sensibles à la casse, alors lors d'erreur PHP a tendance à les mettre entièrement en minuscules, même si elles sont déclarées et appelées avec des majuscules.

    @WebDream : Ton code, tel que tu nous le montres, fonctionne parfaitement (parse errors corrigées).

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Désolé, effectivement j'avais deux version de la classe Section, et j'ai modifié la mauvaise... :S


    Par contre ça ne marche toujours pas même si je n'ai plus la même erreur (j'ai corrigé le point virgule manquant) :

    Notice: Use of undefined constant TABLE_NAME - assumed 'TABLE_NAME' in /home.50/t/l/a/tlabs/classes/sqlObject.php on line 15

    Lors de l'appel à la méthode getAllObjects, il ne trouve pas la constante TABLE_NAME car elle n'est pas déclarée dans la classe parente...

    Vous comprenez le problème ?

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    il ne faut pas que tu utilises une constante mais une propriété.

    Par exemple (non testé) :
    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
    abstract class sqlObject
    {
        protected static $tableName;
     
        public static function getAllObjects()
        {
            global $db;
            $sql = "SELECT * FROM ".self::tableName;
            $rows = $db->query($sql);
            return $rows;
        }
    }
     
    class Section extends sqlObject
    {
    	protected static $tableName = 'section';
    }

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    En fait j'avais déjà essayé avec self::$tableName (il faut le "$" devant pour une propriété statique) mais ça ne marche pas car il cherche la variable $tableName définie dans la classe de la fonction getAllObjects... (or elle est définie dans la classe fille...)


    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1' in /home.50/t/l/a/tlabs/classes/Db.php:54 Stack trace: #0 /home.50/t/l/a/tlabs/classes/Db.php(54): PDO->query('SELECT * FROM ')
    N'y-a-t-il pas de solution pour passer un paramètre de la classe fille dans une méthode de la classe mère ?

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    si tu es en php5.3 il faut utiliser le mot clé static. Autrement, il faut soit utiliser une instance, soit donner le nom de la classe fille ne paramètre.

    Ce topic est en complet rapport avec ton nouveau problème http://www.developpez.net/forums/d62...atic-heritage/

    bye

Discussions similaires

  1. [POO] Héritage et méthode non implémentée
    Par Keweed dans le forum C++
    Réponses: 10
    Dernier message: 08/12/2008, 15h14
  2. [POO] Héritage et fonction non implémentée
    Par delire8 dans le forum C++
    Réponses: 21
    Dernier message: 20/11/2008, 21h55
  3. proposition des méthodes non héritées
    Par apqmwnqmap dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 28/02/2008, 09h37
  4. [POO] Héritage et surcharge de méthodes
    Par defkid dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2007, 14h51
  5. [POO] Héritage d'une méthode getInstance ?
    Par knocc dans le forum Langage
    Réponses: 4
    Dernier message: 13/02/2007, 19h47

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