Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/11/2011, 15h14   #1
Invité de passage
 
Homme
Infographiste
Inscription : novembre 2011
Messages : 1
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 : 1
Points : 0
Points : 0
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 :
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
untitledoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 16h41   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
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 :
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 :
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 :
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/11/2011, 18h22   #3
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 551
Points : 2 551
Envoyer un message via Skype™ à rawsrc
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/11/2011, 11h43   #4
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
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é.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 13h44   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/11/2011, 13h52   #6
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
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.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/11/2011, 15h00   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
C'est à ça que servent les méthodes magiques:
Code :
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;
  }
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h46.


 
 
 
 
Partenaires

Hébergement Web