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

Bibliothèques et frameworks PHP Discussion :

Héritage de classe (débutant cake) [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut Héritage de classe (débutant cake)
    Bonjour,

    J'ai besoin de mettre en place une fonction commune à mes modèles.
    J'ai des modèles définis comme ceci :
    Code de Fournisseur.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    App::uses('AppModel', 'Model');
    class Fournisseur extends AppModel {
     
        public $useTable = 'fournisseurs';
    }
    et
    Code de Articles.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    App::uses('AppModel', 'Model');
    class Articles extends AppModel {
     
        public $useTable = 'articles';
    }

    Ma fonction doit me renvoyer le nom de mes $useTable
    J'ai donc fait :
    Code de AppModel.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    App::uses('Model', 'Model');
    class AppModel extends Model {
        public function getTable(){
            return $this->useTable;
        }
    }

    Tant qu'il n'y a que ça, tout se passe bien, pas d'erreur de compilation.
    Le problème arrive quand je veux appeler cette fonction dans mon contrôleur
    Code de FournisseursController.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    App::uses('AppController', 'Controller');
    class FournisseursController extends AppController {
         public $uses = array(
            'Fournisseur',
            'Article',
        );
        public function index(){
            var_dump($this->Fournisseur->getTable());
            exit();
        }

    L'appel de la fonction me fait une erreur SQL (oui, SQL)
    Citation Envoyé par Erreur
    Error: SQLSTATE[42000]: Syntax error or access violation: 1064 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 'getTable' at line 1
    A noter : la même erreur SQL arrive si je change ma fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public function getTable(){
            return 'toto';
        }
    Quelqu'un peut éclairer ma lanterne ? Même une simple piste...

    (et oui, je sais que je n'ai pas besoin de mettre $useTable = "articles" puisque c'est la convention de nommage automatique, mais le nom de table changera à l'avenir...)

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Chez moi ça marche nickel. La piste que j'émettrai c'est que ton héritage d'AppModel n'est pas correct (mauvais nommage quelque part, de classe ou de fichier).
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Pourtant, tout semble bien se passer dans le reste du code.
    Si je met ma fonction getTable() dans les classes Fournisseur et Article, tout se passe bien.

    Je ne vois pas par où prendre le problème...

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    C'est assez facile à tester, mais pour moi le problème vient bien de l'héritage :

    Dans Fournisseur (ou article) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public function test() {
            var_dump(get_parent_class($this));
            var_dump(method_exists(get_parent_class($this),'getTable'));
            exit;
        }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    J'ai poussé même un peu plus loin... mais bizarrement le code me dit que le fichier n'existe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public function test() {
            var_dump(get_parent_class($this));
            var_dump(get_parent_class(get_parent_class($this)));
            var_dump(get_parent_class(get_parent_class(get_parent_class($this))));
            var_dump(method_exists(get_parent_class($this), 'getTable'));
            exit;
        }
    ça me renvoie :
    string 'AppModel' (length=8)
    string 'Model' (length=5)
    string 'Object' (length=6)
    boolean false
    J'ai un moyen d'afficher le chemin du fichier en cours d'exécution ?
    Peut-être un pb d'écriture dans le tmp ?

  6. #6
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Tout en haut du fichier qui contient la classe que tu penses être l'AppModel :

    Si rien ne change c'est que ton fichier n'est pas "chargé".
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    J'ai finalement trouvé, juste avant de lire ta réponse...
    Le fichier que j'ouvrais, en laissant faire netbeans (ctrl+clic sur "AppModel" dans le fichier Fournisseur) était

    /lib/Cake/Console/Templates/skel/Model/AppModel.php

    Le fichier qui devait être lu, c'était

    app/Model/AppModel.php

    Je garde ton code sous le coude, il pourrait m'être très utile.
    (il m'aurait d'ailleurs donné la réponse...)

    Merci beaucoup Spartacusply, problème résolu.

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

Discussions similaires

  1. conflit d'inclusions et Héritage de classe
    Par gedeon555 dans le forum C++
    Réponses: 7
    Dernier message: 01/10/2006, 19h48
  2. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00
  3. Héritage de classes.
    Par Berzerk_ dans le forum C++
    Réponses: 48
    Dernier message: 13/08/2006, 23h48
  4. [POO] Héritage vs classe dans une classe
    Par robichou dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2006, 23h51
  5. [OO] Héritage - Mixins Classes
    Par djmalo dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 01/03/2005, 23h16

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