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 fonction hydrate [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2012
    Messages : 34
    Points : 31
    Points
    31
    Par défaut POO fonction hydrate
    Bonjour,
    j'ai essayé de faire un petit exemple simple pour créer un utilisateurs, mais ma fonction hydrate de fonctionne pas et je n'ai absolument pas la moindre idée de pourquoi elle ne veut pas fonctionner, donc si une personne voit ou se trouve le probleme ....

    Je vous mets mon
    User.class.php
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     class User
    {
        private $_iduser;
        private $_nomuser;
        private $_lvluser;
        private $_droituser;
     
     
        // Un tableau de données doit être passé à la fonction (d'où le préfixe « array »)
        public function hydrate(array $donnees)
    {
    	foreach ($donnees as $key => $value)
    	{
            // On récupère le nom du setter correspondant à l'attribut
            $method = 'set'.ucfirst($key);
     
            // Si le setter correspondant existe
            if (method_exists($this, $method))
            {
                // On appelle le setter
     
                $this->$method($value);
            }
        }
    }
     
        public function iduser() { return $this->_iduser; }
        public function nomuser() { return $this->_nomuser; }
        public function lvluser() { return $this->_lvluser; }
        public function droituser() { return $this->_droituser; }
     
        public function setIdUser($iduser)
        {
            $this->_iduser = (int) $iduser;
        }
     
        public function setNomUser($nomuser)
        {
            // On vérifie qu'il s'agit bien d'une chaine de caractères
            // Dont la longueur est inférieure à 30 caractères
            if (is_string($nomuser) && strlen($nomuser) <= 50)
            {
                $this->_nomuser = $nomuser;
            }
        }
     
        public function setLevelUser($leveluser)
        {
            if (is_string($leveluser) && strlen($leveluser) <= 30)
            {
                $this->_lvluser = $leveluser;
            }
        }
     
        public function setDroitUser($droituser)
        {
            if (is_string($droituser) && strlen($droituser) <= 30)
            {
                $this->_droituser = $droituser;
            }
        }
     
    }
    Et voici mon main.php avec l'appel de la classe et la tentative de création d'un User


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     function chargerClasse($classname)
    {
        require $classname.'.class.php';
    }
    spl_autoload_register ('chargerClasse');
     
    $perso = new User(array('nomuser' => 'tititest', 'lvluser' => 'debutant', 'droituser' => 'editeur'));
    echo $perso->nomuser();
    echo 'lalala';
    Merci de votre aide

    EDIT : Désolé je n'ai pas poster dans la bonne partie, je sais pas ce que j'ai fait.Si un modo peut déplacer au bon endroit.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    tu n'as pas de constructeur, si tu veux garder new User(...)
    il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      public function __construct(array $donnees){
        //Initialisation des membres de la classe
      }
    à la place de la fonction hydrate

    Afin d'optimiser le code, pour ne pouvoir instancier les propriété des users qu'àpartir de la class User, tu peu mettre toutes les fonctions set... en private il me semble, mais ca c'est uniquement une question conceptuelle, ca dépends de ce que tu veux pouvoir faire
    Conception / Dev

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Non pas nécéssairement, on peut vouloir utiliser le constructeur par défaut, c'est tout à fait correct.

    Sinon, je ne vois vraiment pas pourquoi ta fonction hydrate ne fonctionnerai pas à moins que les clés de ton tableau ne soient pas bonnes, vérifie de ce coté là en utilisant un var_dump.

    Enfin, je ne vois vraiment pas ce qu'apporte cette méthode ni son rôle. Une méthode setParams ou setAttributes serait déjà plus parlante.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    Benjamin tu es d'accord qu'avec la class actuelle ca ne peu pas fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $perso = new User(array('nomuser' => 'tititest', 'lvluser' => 'debutant', 'droituser' => 'editeur'));
    donc soit faire comme je proposais, soit écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $perso = new User;
    $perso->hydrate(array('nomuser' => 'tititest', 'lvluser' => 'debutant', 'droituser' => 'editeur'));
    Conception / Dev

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ah oui, bien entendu (j'avais même pas remarqué qu'il faisait pas de new ).

    Donc oui tu as au moins besoin d'une instance pour faire ça.
    Ou alors rendre la méthode hydrate statique et lui donner le comportement d'une fabrique, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static function hydrate(array $donnees) {
      $int = new self;
      foreach ($donnees as $key => $value) {
        $method = 'set'.ucfirst($key);
        if (method_exists($inst, $method))
          $this->$method($value);
      }
       return $inst;
    }
    Et les clés doivent toujours respecter la casse, même si tu utilise ucfirst car tu as des seconds mots dans les noms de tes méthodes. Ou alors fait un switch.

    -- EDIT

    C'est pas la première fois que j'entends parler d'hydratation. C'est quoi ce concept et surtout qui enseigne ça ? J'ai jamais vu ce pattern et pourtant ça fait pas mal de temps que je fais de la POO dans plusieurs langages.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    j'ai trouvé quelque chose sur un autre site.

    Une méthode hydratant un objet consistera à assigner des valeurs aux attributs souhaités. Pour cela, on lui fournit un tableau associatif : la clé est l'attribut et la valeur est celle de l'attribut. Il faut bien penser à contrôler ces valeurs afin que l'utilisateur ne mette pas n'importe quoi : les setters sont là pour nous !
    Conception / Dev

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Mouais, pourquoi pas. Sinon y'a les filtres pour ça normalement.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2012
    Messages : 34
    Points : 31
    Points
    31
    Par défaut
    Merci de vos réponses, c'est vrai que c'est bizarre.
    J'ai finalement opté par des fonctions plus simple en me servant d'un constructeur ...

    Merci de votre aide

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pour ce qui est des designs patterns, voici quelques références utiles:

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

Discussions similaires

  1. Récupération de donnée en POO (fonction hydrate et construct)
    Par vince_quebec dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/07/2014, 14h28
  2. [POO] Fonction à nombre de paramètres dynamique
    Par Digimag dans le forum Langage
    Réponses: 13
    Dernier message: 14/02/2008, 22h32
  3. [POO] Fonction Affichage OBjet Javascript!
    Par lekunfry dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 20/07/2007, 06h28
  4. [POO] Fonctions dans une classe abstraite
    Par Seth77 dans le forum Langage
    Réponses: 4
    Dernier message: 27/06/2006, 13h21
  5. [POO] fonction toUpperCase : Objet attendu
    Par LineLe dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2005, 16h51

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