Es-ce que c'est nécessaire en PHP d'avoir un Get/Set pour chaque attributs ?

Eléphanteau du PHP | 10 Messages

21 févr. 2009, 05:13

Bonjour,

Ma question est simple, au collège on apprend le Java.. et il nous on montré de faire des GET/SET/VALIDATE partout pour chaque attributes d'une classe... cependant, es-ce que c'est nécessaire en PHP d'avoir un Get/Set pour chaque attributs ?

Y-a-t-il un moyen plus efficace et rapide ? Qu'elle est la bonne méthode ?

Merci.

ViPHP
ViPHP | 1136 Messages

21 févr. 2009, 10:41

hi,

le java au collége !!!! et bien ils s'y prennent tôt !! :)

Ce sont des accesseurs , permet d'accéder aux attributs privés ... de la classe instancié !

Si on les mets partout , autant laisser les attributs en public ...

Je trouve que ces accesseurs cassent l'encapsulation ..

Bref , sinon , si tu veux faire autrement , on peu avoir recourt à une petite surcharge de membres , tu as donc les méthodes magiques __get() et __set() qui sont génériques , je te laisse lire la doc pour plus d'infos .



Get et Set

Ch.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 févr. 2009, 12:08

Alors effectivement, ce n'est pas "nécessaire", mais c'est loin d'être inutile...

L'accesseur a en effet l'avantage de te permettre de contrôler l'accès à un attribut et ainsi éviter d'y retrouver n'importe quoi... c'est d'autant plus intéressant avec php qui ne type pas ses variables :)

Ca ne casse pas l'encapsulation, au contraire, ça l'enrichie dans le sens où il ne s'agit plus d'un "tout accès" ou "sans accès", mais d'une multitude de possibilités intermédiaires qui peuvent être définies dans l'accesseur :)

Cf. la réponse que j'ai donné à Megadeth, un accès public à un attribut permet au développeur d'y affecter n'importe quelle valeur n'importe quand, tandis qu'un accès restreint par un set permet éventuellement de contrôler et d'assurer le type, le format, la taille, etc.

A chacun ensuite de voir le besoin qu'il peut en avoir.. pour un script perso, destiné à soi et que personne d'autre ne verra, c'est peut être pas utile de se prendre la tête... si c'est pour un usage partagé avec d'autres développeurs, certaines conventions et contrôles peuvent s'avérer nécessaires si on ne veut pas passer son temps à débugger ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
AB
ViPHP | 5818 Messages

21 févr. 2009, 12:28

A chacun ensuite de voir le besoin qu'il peut en avoir.. pour un script perso, destiné à soi et que personne d'autre ne verra, c'est peut être pas utile de se prendre la tête... si c'est pour un usage partagé avec d'autres développeurs, certaines conventions et contrôles peuvent s'avérer nécessaires si on ne veut pas passer son temps à débugger ;)
++
pour moi qui travaille en solo, je n'en voit pas l'utilité, mais je peux comprendre qu'il en soit autrement pour un travail de groupe.

ViPHP
ViPHP | 1136 Messages

21 févr. 2009, 13:02

L'accesseur a en effet l'avantage de te permettre de contrôler l'accès à un attribut et ainsi éviter d'y retrouver n'importe quoi...
C'est vrai , je n'ai pas vue la chose sous cet angle .. et je suis complètement d'accord avec toi .

Mais par contre que penser de __set() et __get() ... ces méthodes magiques sont générique aucun filtrage de type est possible ...

Seule la vérification que l'on tente d'accéder à un attribut définie et non en créer un à la volé me semble utile ... non ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 févr. 2009, 13:50

les __set() et __get() te permet d'éviter d'écrire les setter/getter "neutres"
public function setId( $id )
{
    $this->id = $id
}

public function getId()
{
    return $this->id
}
Comme ça, tu peux te contenter de définir les setter/getter plus spécifiques.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

21 févr. 2009, 19:18

J'ai pris pour habitude (Propel inside) de n'utiliser que des accesseurs, ainsi par défaut un attribut n'est tout simplement pas accessible, et si je veux le rendre accessible c'est systématiquement via les getters & setters.

Cela permet de :
- Faire des attributs en lecture seule ou écriture seule
- Contrôler exactement le type et le format des données
- Effectuer d'éventuelles opérations de transformation des données lors d'un changement de valeur

Et comme on ne sait jamais si on aura besoin plus tard de le faire ou non, il vaut mieux passer directement par des accesseurs, comme ça le jour où il faut effectuer ce type d'opération sur un attribut alors qu'on ne le faisait pas avant, la modification est très légère, alors que sinon le refactoring peut être sportif...

Eléphanteau du PHP | 10 Messages

21 févr. 2009, 23:54

Dac.. et bien moi je développe un genre de framework pour usage personnel (parce que j'aime pas sa travailer sur des trucs que je n'ai pas fait alors j'aime mieux tout faire par moi même!) mais plus tard ce framework sera probablement disponible en téléchargement pour ceux et celle qui aimerai concevoir des siteweb de façon plus rapide.

Donc je croit que pour moi les get/set/valider risque d'être utile. C'est surment long à faire si on a genre 10 attributs mais après qu'ils sont fait.. l'on a plus a se cassé la tête vraiment.

Merci pour vos réponses.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 févr. 2009, 11:37

Ca parait effectivement un peu plus long et un peu plus lourd à mettre en place, mais comme le dit naholyr, c'est un gain de temps incroyable quand il faut revenir dessus :)

D'autant plus que certains éditeurs comme Eclipse (bon, c'est pas mon préféré mais il a ce mérite là) te proposent de les générer pour toi en un clic :)

Une autre solution pour gagner du temps (celle que j'utilise), c'est de se faire une petite fonction php à laquelle je passe le nom d'un attribut et son type, et qui me génère les get & set qui vont bien (et avec les commentaires pour la doc tant qu'on y est ;)).

Je n'ai plus qu'à faire un copier/coller du code généré dans ma classe et mes accesseurs sont prêt à l'emploi :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 991 Messages

22 févr. 2009, 11:44

Ryle ca a l'air tres interressant , tu peux m'expliquer car j'ai pas compris ???

tu utilise quelque chose comme
function ($id , $valeur)
{
$this->$id = $valeur;
}
:?:
DevOps, Symfony4, Hoa

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

22 févr. 2009, 12:00

Non, c'est un get/set par attribut (ou moins, si on veut faire du lecture seule ou écriture seule) :
/**
 * @var int $age_capitaine Âge du capitaine
 */
protected $age_capitaine;

/**
 * Définir l'âge du capitaine
 * 
 * @param int $age_capitaine
 */
public function setAgeCapitaine($age_capitaine)
{
  $this->age_capitaine = intval($age_capitaine); // Exemple de transformation : on force le type "int"
}

/**
 * Récupérer l'âge du capitaine
 *
 * @return int
 */
public function getAgeCapitaine()
{
  return $this->age_capitaine;
}

Eléphanteau du PHP | 10 Messages

22 févr. 2009, 14:29

Ca parait effectivement un peu plus long et un peu plus lourd à mettre en place, mais comme le dit naholyr, c'est un gain de temps incroyable quand il faut revenir dessus :)

D'autant plus que certains éditeurs comme Eclipse (bon, c'est pas mon préféré mais il a ce mérite là) te proposent de les générer pour toi en un clic :)

Une autre solution pour gagner du temps (celle que j'utilise), c'est de se faire une petite fonction php à laquelle je passe le nom d'un attribut et son type, et qui me génère les get & set qui vont bien (et avec les commentaires pour la doc tant qu'on y est ;)).

Je n'ai plus qu'à faire un copier/coller du code généré dans ma classe et mes accesseurs sont prêt à l'emploi :)
En plein sa j'ai eu comme idée ! un générateur de classe.. qui pourrai générer toute ses méthodes et ainsi généré le PHPDOC en même temps.. après sa ta juste a modifié ce que tu veut et tout ! c'est sympa ! mais je rajoute aussi des valider(Attrib) pour chaque attributs.. comme sa quend je set.. cela valide en même temps. Bien qu'un simple switch pourrai faire dans une simple méthode à ce niveau...

Mammouth du PHP | 991 Messages

22 févr. 2009, 14:42

Donc en gros pour chaque variable , il faut 2 fonctions de vérification ?

Il faut setter , et getter quels variables , celles qui passe dans le constructeur ? ou toutes les variables en générale ?
ou alors j'ai rien compris et je m'en excuse.

Merci Hawk
DevOps, Symfony4, Hoa

Eléphanteau du PHP | 10 Messages

22 févr. 2009, 23:42

Ouais et bien c'est pour chaque variable en effet.. moi j'y ajoute une méthode validation...

donc en résumé tu a de base une méthode GET, SET pour chaques variables d'une classe ainsi qu'une méthode validation.. normalement cette validation peut se faire directement dans le SET.. c'est pour évité que que la classe prenne nimporte quelle valeur qu'on lui donne.. mais j'aime mieux tout séparé c'est plus coérant.