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 :

Quelle methode pour les getter/setter ?


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Infographiste
    Inscrit en
    Novembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Infographiste
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Quelle methode pour les getter/setter ?
    Bonjour à tous,

    Je me suis mis à l'apprentissage de le POO en PHP. Je suis en train de construire un site et je me demande quel est la meilleur façon d'accéder et de modifier les valeurs des variables de mes classes.

    J'ai commencé à écrire une méthode get() et une méthode set() pour chaque variable, mais j'ai une 20aine de variables et je trouve ça un peu répétitif pour faire finalement toujours la même chose. Alors en continuant mes lectures sur le PHP, je vois qu'il est possible d'utiliser des méthodes magiques qui me font la même chose en quelques lignes, quelque soit le nombre de variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function __set($name, $value) {
        return $this->$name = $value;
    }
     
    public function __get($name) {
        return $this->$name;
    }
    Mais avec cette technique, je ne vois pas trop quel serait la différence si je déclarais toutes les variables en public puisque finalement je vais appeler mes objets comme si j'accédais directement à une variable public. Quel est donc l'intérêt de déclarer tout en private ? et quel est la meilleur façon de créer les getter et setter pour un nombre important de variables?

    Merci d'avance

  2. #2
    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 : 37
    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
    Les membre qui ont vocation à être disponibles sans limitation en dehors de la classe doivent être publiques.

    Les méthodes __get et __set sont utiles notamment dans les cas suivants:
    1 - on veut forcer un traitement (vérification par exemple) sur les données
    2 - la classe doit exposer des attributs dynamiques (contenus dans une collection ou un tableau)
    3 - on veut donner un accès à des membres publiques d'un objet décoré au sein de son wrappeur
    - etc.

    Exemples:
    1 - Vérification et validation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class TestA {
      protected $_a;
      protected $_b;
      protected $_c;
     
      public function __set ($key, $value) {
        if (!in_array($key, array('a', 'b', 'c') || empty($value)) {
          throw new InvalidArgumentException;
        }
        $key = "_{$key}";
        $this->$key = $value;
      }
    }
    2 - Attributs dynamiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class TestB {
      protected $_data = array();
     
      public function __get ($key) { 
        return isset($this->_data[$key]) ? $this->_data[$key] : null;
      }
     
      public function __set ($key, $value) {
        $this->_data[$key] = $value;
      }
    }
    3 - Accéder aux propriétés d'un membre composé
    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
    class TestC {
       public $a;
       public $b;
       public $c;
    }
     
    class TestD {
      protected $_test_c_inst;  
     
      public function __construct (TestC $test) {
        $this->_test_c_inst = $test;
      }
     
      public function __get ($key) {
        return isset($this->_test_c_inst->$key) ? $this->_test_c_inst->$key : null;
      }
    }
    Note: Ces deux méthodes magiques font très bon ménage avec __isset

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Les membre qui ont vocation à être disponibles sans limitation en dehors de la classe doivent être publiques.
    Alors là sur ce point j'en suis revenu. J'avais pour habitude de respecter cette règle jusqu'au jour (lointain) où j'ai eu à faire d'importantes adaptations dans un vaste programme. Modifications qui m'ont obligé à redéfinir la visibilité d'un paquet d'attributs et là je ne vous raconte pas le bordel.
    Du coup je ne mets plus aucun attribut public, c'est private/protected (à la rigueur) et ainsi je suis absolument sûr que tout sera accessible via des setters/getters. Plus à se faire des noeuds si l'on change la visibilité d'un attribut. C'est plus long (pénible) à écrire mais par contre côté évolution c'est total confort. D'ailleurs le rapport temps supplémentaire passé à écrire les setters/getters vaut largement le temps passé à refactoriser tout le code parce qu'on y a fait une modification au niveau de la visibilité d'un attribut.

    Puisque on y est et dans la même logique, j'en suis également revenu de la distinction des variables/fonctions selon leur visibilité. Plus aucun _ devant les variables ou fonctions private/protected. Là aussi j'ai bien dégusté : tomber dans une même fonction sur $_variable et un peu plus loin $variable par ce que le type était en panne d'inspiration...
    J'ai même eu dans une classe un protected $_variable; et dans la classe dérivée un public $variable; C'est vous dire les maux de tête.
    En interdisant ce foutu underscore, vous allez faire des économies d'aspirine, croyez-moi.

  4. #4
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Alors là sur ce point j'en suis revenu. J'avais pour habitude de respecter cette règle jusqu'au jour (lointain) où j'ai eu à faire d'importantes adaptations dans un vaste programme. Modifications qui m'ont obligé à redéfinir la visibilité d'un paquet d'attributs et là je ne vous raconte pas le bordel.
    Je suis d'accord. Je mets aussi systématiquement des getter/setter. Le jour ou tu dois ajouter une vérif t'es moins embêté.

  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 : 37
    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
    Citation Envoyé par Marc3001 Voir le message
    Je suis d'accord. Je mets aussi systématiquement des getter/setter. Le jour ou tu dois ajouter une vérif t'es moins embêté.
    De toute façon, cela revient au même qu'un attribut soit en visibilité publique par implémentation ou non.

  6. #6
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    De toute façon, cela revient au même qu'un attribut soit en visibilité publique par implémentation ou non.
    Sauf que le jour où tu veux ajouter un traitement au moment du get ou du set, tu dois ajouter tes accesseurs et modifier la portée de tes propriétés mais aussi modifier tous les appels à ces propriétés et là c'est vite la galère.

  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 : 37
    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
    C'est à ça que servent les méthodes magiques:
    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
     
    class FooBar {
     
      public function setX ($x) { 
        if ($x > 0 && $x < 100) 
          $this->x = $x;
        else
          throw new InvalidArgumentException;
      }
     
      public function setY ($y) {
        if ($y > 100 && $y < 200)
          this->y = $y;
        else 
          throw new InvalidArgumentException;
      }
     
      public function __set ($key, $value) {
        if (method_exists($this,  $m = "set{$key}"))
           return $this->$m($value);
        else
           $this->$key = $value;
      }
    }

Discussions similaires

  1. Changer le refactor pour les getters and setters
    Par chezlui dans le forum NetBeans
    Réponses: 2
    Dernier message: 05/12/2011, 11h21
  2. y'a t'il des methodes pour les .txt
    Par warning dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/04/2007, 10h23
  3. [ASA] Quelle extention pour les fichiers de données?
    Par Goldorak2 dans le forum SQL Anywhere
    Réponses: 2
    Dernier message: 07/12/2005, 10h28
  4. [Info]générer automatiquement les getters / setters
    Par lr dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/02/2005, 11h14

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