Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/11/2011, à 15:04

untitledoc

[PHP POO] 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.

        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 smile

Hors ligne

#2 Le 11/11/2011, à 15:32

Tycho Brahe

Re : [PHP POO] Quelle methode pour les getter/setter ?

Salut,

Comme tu l'as toi même remarqué à juste titre, utiliser des méthodes génériques reviendrait à tout avoir en public et est donc à ne pas utiliser. Bien que n'ayant pas de solution miracle à ce soucis de temps, je te proposerais deux idées :
- Générer le code de manière automatique à l'aide d'un script.
- Utiliser les traits afin de n'écrire qu'une seule fois tout ce qui est assez générique et que tu utilises dans plusieurs classes.

Concernant les traits, quelques réserves cependant :
- Ce n'est dispo qu'à partir de php 5.4, donc impossible avec la version stable actuelle.
- Contrairement à un code généré que tu peux par la suite éditer, le trait t'empêche de pouvoir écrire quelque chose de vraiment spécifique à ta classe. A vouloir être trop générique on risque de faire des bêtises.
- Aucune utilité dans le cas d'une seule classe avec plein d'attributs qui ne sont utilisés nulle part ailleurs.

Au passage, j'aurais tendance à penser que si tu te retrouves avec une classe bourré d'attributs c'est que as un truc qui "fais le café" qui aurait bien besoin d'être revu. Après je ne connais pas ton code mais bon, en général ce n'est pas un très bon signe.


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#3 Le 11/11/2011, à 16:09

untitledoc

Re : [PHP POO] Quelle methode pour les getter/setter ?

Merci pour ta réponse.

Tycho Brahe a écrit :

Au passage, j'aurais tendance à penser que si tu te retrouves avec une classe bourré d'attributs c'est que as un truc qui "fais le café" qui aurait bien besoin d'être revu. Après je ne connais pas ton code mais bon, en général ce n'est pas un très bon signe.

Ok, peut-être bien aussi.

J'aimerais alors te poser la question, pour imaginons une classe "Membre", il faudrait un certain nombre de variable comme nom, prénon, email, password, ville, tel, enfant, job, nationalité, sexe, langue, date de naissance, etc.
Est-ce que premièrement toutes ces variables doivent être déclarées en private? Pourquoi le private déjà, c'est un concept que j'ai un peu du mal à saisir.

Et donc pour l'instant, j'aurais quelque chose comme ceci pour les getter/setter, qui comme je disais, me parait un peu long et répétitif :

        public function setNom($nom) {
            $this->nom = $nom;
        }

        public function getNom() {
            return $this->nom;
        }
       
        public function setPrenom($prenom) {
            $this->prenom = $prenom;
        }       
       
        public function getPrenom() {
            return $this->prenom;
        }

        public function setEmail($email) {
            $this->email = $email;
        }       
       
        public function getEmail() {
            return $this->email;
        }

        etc etc



Est-ce comme ceci que je dois faire ou je ne m'y prend pas vraiment bien?

Dernière modification par untitledoc (Le 11/11/2011, à 16:19)

Hors ligne

#4 Le 11/11/2011, à 23:53

ssdg

Re : [PHP POO] Quelle methode pour les getter/setter ?

C'est bien ça qu'il faut faire (à la base) ensuite, le codage object à un paquet de "coutumes" un peu bizarres... jusqu'au jour ou tu découvres la raison.

Par exemple, en java (je ne sais pas si le PHP le fait et comment) il existe des outils comme hibernate (une bibliothèque qui charge/sauvegarde des objets depuis/dans une BDD) cet outil crée, a ma connaissance, une "coquille" autour de l'objet qu'il remonte depuis la base et ajoute du code en début/fin des getters/setters pour suivre les modifications. Ce ne serait pas possible si la modification se faisait directement sur la propriété (enfin, je crois). Tu vas me dire, c'est du java, alors OSEF, mais je sais qu'en javascript tu peux en faire autant (pour d'autres intérêts, j'imagine) en remplaçant une fonction par une autre par exemple.

En tout cas, c'est une super bonne chose de commencer à coder en regardant les "bonnes pratiques". Félicitations.


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#5 Le 12/11/2011, à 00:16

Tycho Brahe

Re : [PHP POO] Quelle methode pour les getter/setter ?

untitledoc a écrit :

Est-ce que premièrement toutes ces variables doivent être déclarées en private? Pourquoi le private déjà, c'est un concept que j'ai un peu du mal à saisir.

Oui, c'est le principe d'encapsulation. Je t'invite à lire l'article wikipedia pour plus de détails.

Juste pour préciser, tu n'es pas obligé de faire des getter/setter pour chaque attribut, et isl ne sont pas tous forcément identiques. Par exemple, imaginons que l'un de tes attributs soit un objet contenant une sorte de liste, tes getter/setter seront totalement différents de ce que tu fais : tu devrais faire de quoi ajouter dans la liste etc.

Bien entendu les setter servent aussi très souvent pour vérifier la cohérence de ce que l'on veux assigner à notre attribut.

ssdg a écrit :

En tout cas, c'est une super bonne chose de commencer à coder en regardant les "bonnes pratiques". Félicitations.

Je plussoie, bravo.


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#6 Le 12/11/2011, à 22:45

untitledoc

Re : [PHP POO] Quelle methode pour les getter/setter ?

Merci pour vos réponses smile

Tycho Brahe a écrit :

Par exemple, imaginons que l'un de tes attributs soit un objet contenant une sorte de liste, tes getter/setter seront totalement différents de ce que tu fais : tu devrais faire de quoi ajouter dans la liste etc.

Bien entendu les setter servent aussi très souvent pour vérifier la cohérence de ce que l'on veux assigner à notre attribut.

Effectivement, je t'avoue que j'en suis au debut de l'ecriture de mes classes et je n'avais pas encore pensé à tout ce qui est tests, listes, etc. Je vois plus d'intéret à séparer tous les setters à présent.

Hors ligne

#7 Le 13/11/2011, à 00:27

Tycho Brahe

Re : [PHP POO] Quelle methode pour les getter/setter ?

Au passage, j'en profite pour te recommander chaudement ce livre : Head First Design Patterns. Depuis que O'Reilly France a fermé il n'est plus édité en français et tu devras te contenter de la version anglaise, mais je suppose que ça ne pose pas de problème. Je précise également que tous les exemples sont écrits en Java et qu'il y a quelques passages qui sont spécifiques à ce langage, mais malgré ceci ça reste un excellent livre pour apprendre les design patterns. Moi même je ne programme pas en Java (j'en ai juste quelques notions) mais j'ai beaucoup appris avec ce livre.


Loi de Newton :
Si tu restes à glander sous le pommier, tu pourrais bien prendre une pomme sur la gueule.

Hors ligne

#8 Le 14/11/2011, à 17:16

Mathieu147

Re : [PHP POO] Quelle methode pour les getter/setter ?

Mettre ta variable publique, ça permet d'avoir un code plus simple pour ta classe (un setter et un getter de moins), mais les avantages s'arrêtent là. Dans les classes qui utilisent ta classe, est-ce que ceci:

$truc->machin = "bidule";

est vraiment plus concis et clair que ça?:

$truc->setMachin("bidule");

Personnellement, je ne trouve pas.

Utiliser un setter te permet des vérifications. Par exemple, si tu stockes une adresse e-mail, tu peux lancer une exception si l'adresse n'est pas bien formatée. Ainsi, dans les autres fonctions qui utilisent le champ adresse e-mail, tu peux considérer que tu as dans tous les cas une adresse valide puisque tu fais la vérification dans le setter, et donc à chaque changement.

Ça permet aussi de faire un prototype de ta classe assez rapidement, avec un très simple

public function setEmail($email) {
  $this->email = $email;
}

au départ, et d'implémenter la vérification par la suite, sans devoir réécrire les classes qui utilisent cette fonction.


Pffff…

Hors ligne