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 :

Méthodes magiques et héritage


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Méthodes magiques et héritage
    Bonjour,

    J'avais imaginé ceci pour gérer mes modèles dans un framework maison (framework créé juste à des buts pédagogiques) mais cela ne fonctionne pas...
    (j'ai allégé un peu le code pour ne garder que l'essentiel)

    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
    26
    27
     
    abstract class Model extends PDO{
     
      protected $describe = array();
      protected $values = array();
     
      function __set($name, $value) {
        if (in_array($name, $this->describe)
          $this->values[$name] = $value;
        else
          throws new Exception('Attributs inexistant');
      }
     
      function save() {
        //sauvegarde dans bdd...
      }
     
      //etc...
    }
     
     
    class MyObject extends Model {
     
      protected $describe = array('champs1', 'champs2', 'champs3');
     
    }
    }

    et quand j'utilise ça, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    $myO = new MyObject();
    $myO->champs1 = "test";
    $myO->champs2 = "test";
    $myO->champs3 = "test";
     
    $myO->save();
    j'obtiens une erreur : Fatal error: Call to undefined method stdClass::save()
    si je fais un peu de débug avec un var_dump, il me dit que mon object n'est pas un "MyObject" mais un "object(stdClass)". Du coup, je me dis que je ne dois pas connaitre tous les mécanismes de l'object en PHP et que mon idée de base n'était pas si bonne...
    Si quelqu'un pouvait m'expliquer pourquoi cela ne fonctionne pas, je le remercie d'avance!

  2. #2
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 906
    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 906
    Points : 14 828
    Points
    14 828
    Par défaut
    Ca serait bien que tu nous donnes un code fonctionnel, là on perd juste du temps à débugger ton exemple pour essayer de t'aider.

    Après, dans la conception, ton framework n'est pas logique. Tu fais étendre un modèle d'une classe d'abstraction à la base de données PDO.

    Dans l'idéal, tu créés un trait Model et non une classe qui hérite de PDO (aucun lien logique d'héritage entre les deux) et tu utilises ce trait pour que tes classes de modèles (MyModel) puissent utiliser les fonctionnalités de Model.

    http://php.net/manual/fr/language.oop5.traits.php

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Dans ta classe MyObject qui étend de Model, pourquoi redéfini tu la variable describe ? La définition d'un constructeur vide réglerais le problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class MyObject extends Model{
      public MyObject(){
          parent::__construct();
          $this->describe = array("val1","val2","val3");
      }
    }
    ensuite sur ta classe abstraite Model, tes methodes n'ont pas de propriété d'accès (encapsulation)

    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
     
    abstract class Model{
      protected $describe;
      protected $values;
      public Model(){
        $this->describe = array();
        $this->describe = array();
      }
     
      public function __set($name,$value){
        ....
      }
      public function save() {
        //sauvegarde dans bdd...
      }
    }
    L'absence de propriété d'accès (j'ai oublié le nom exact de public/protected/private) défini par défaut les methodes comme accessible dans un package, il faut les définir en public pour pouvoir y accéder à l'exterieur de la classe
    Ca devrait marcher un petit peu mieux

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 906
    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 906
    Points : 14 828
    Points
    14 828
    Par défaut
    Citation Envoyé par ocalik Voir le message
    il faut les définir en public pour pouvoir y accéder à l'exterieur de la classe
    C'est l'intérêt de la méthode magique __set() et son acolyte __get().

Discussions similaires

  1. Méthode magique ManyToMany
    Par chenel80 dans le forum Zend_Db
    Réponses: 1
    Dernier message: 18/04/2009, 13h47
  2. [POO] Méthode static et héritage
    Par Mogwaï dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2008, 13h31
  3. Réponses: 2
    Dernier message: 10/04/2008, 22h36
  4. Réponses: 9
    Dernier message: 13/03/2008, 13h25
  5. [POO] Méthode magique __sleep
    Par sliderman dans le forum Langage
    Réponses: 3
    Dernier message: 19/02/2008, 15h49

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