7998 sujets

Développement web côté serveur, CMS

Bonjour,

Dans un exercice de programmation, on me demande de
- Développez les méthodes assesseurs getX() et getY();
- Développez les méthodes mutateurs setX(x) et setY(y);

Nous travaillons en php et je ne connais absolument pas ces notions ! Pourriez vous m'aider ?

Merci bien !
Apparemment c’est du vocabulaire d’enseignant !
"assesseur". ça doit vouloir dire "permettant d’accéder à une valeur" et "mutateur" "permettant de changer la valeur"
Tout à fait PapyJP. On les retrouves en anglais sous les dénomination respectives "getters" et "setters".

L'assesseur permet de faire ressortir de la classe la valeur traitée de la variable désirée. On la préfèrera sans mise en forme.

Le mutateur permettra d'hydrater une variable de la classe après traitement par celle-ci.

Dans la forme la plus épurée, ça donne un truc comme:
class test {
private $_x = '';

public function setX($x) { $this->_x = $x; }
public function getX() { return $this->_x; }
}


On les utilisera ensuite ainsi:
$test = new test();
$test->setX('Yipikaï !');
echo '<p><b>' . $test->getX() . '</b></p>';

Résulat:
Yipikaï !
Smiley smile
Modifié par Greg_Lumiere (04 Dec 2019 - 13:03)
Hello

Je vais rajouter également mon explication Smiley smile

Les getters/setters (généralement on les nommes comme ça, pour ceux qui aime le franglais) sont des méthodes qui te permettent d'accéder à des attributs d'une classe..

n'ai pas peur : je m’explique !

=> Dans une classe, tu peux avoir différents trucs, des attributs, des méthodes etc..
Au niveau des attributs tu peux leur définir une "visibilité". Par défaut il me semble qu'une variable est public, c'est à dire qu'elle est accessible par tous. Mais tu peux la définir sur Private, ou Protected.

Si ma variable est public dans ma ClassA,
alors si je fais un $classA = new ClassA()
je pourrais faire un $classA->ma_variable = "Un texte."
et écris dans ma_variable de classeA.

Mais si ma_variable est sur Private alors je pourrais pas faire ça, j'aurais une erreur direct.
C'est une des raisons de l'existence des getters/setters.
Du coup, je vais au seins de ma classe créer deux méthodes
get() et set()
(je te laisse regarder le post de greg au dessus pour voir la syntaxe)
et donc je pourrais faire
$classA = new ClassA()
$classA->setMaVariableA("Un texte");

et là c'est donc la méthode set qui me permet d'écrire dans ma variable
Donc le get pour récupérer et le set pour écrire.
Imagine qu'à la place de mon $classA->ma_variable = "Un texte." je mette du code frauduleux à la palce de "un texte". tu serais bien baisé.
Alors que si j'utilise le setVariableA() je peux au seins de la méthode faire directement un contrôle (comme ça a chaque fois qu'on voudra set ma variable il y aura toujours ce contrôle).


Si j'ai un setAge() sur une classe Personne alors dans mon setter je pourrais préciser

public function setAge($x) { 
$x = parseInt($x);
    if($x >18 && $x < 99)
    {
        $this->_x = $x; 
    }
}

Et là je massure que j'ai bien un age comprit entre 18 et 99. et pas un autre chose!

J'espère avoir été clair, je crois pas mais bon.. Smiley smile j'espère que je t'ai pas embrouillé plus qu'autre chose.
Modifié par JENCAL (04 Dec 2019 - 13:47)
Meilleure solution
manoon a écrit :
Bonjour,

Dans un exercice de programmation, on me demande de
- Développez les méthodes assesseurs getX() et getY();
- Développez les méthodes mutateurs setX(x) et setY(y);

Nous travaillons en php et je ne connais absolument pas ces notions ! Pourriez vous m'aider ?

Merci bien !

Terminologie classique en POO (Programmation Orientée Objet)...
On utilise plus souvent les termes :
- accesseur en lecture (getter)
- accesseur en écriture (setter)
L'idée étant de protéger l'accès aux champs interne et gérer finement ce que la classe objet laisse sortir ou accepte en entrée.
Les accesseurs sont par ailleurs affublés d'un mot clé (private / protected / public) permettant de définir qui pourra faire appel ou non aux accesseurs en question (notion de "visibilité").
Au niveau de l'accesseur en lecture, on pourra par exemple :
- s'assurer au préalable que celui qui demande l'accès à la donnée dispose des droits nécessaires pour le faire
- gérer un domaine de validité (ex. canal alpha d'une couleur entre 0 et 255)
Au niveau de l'accesseur en écriture même topo :
- s'assurer des droits en modification de l'objet
- etc.
Un autre aspect intéressant du passage via les accesseurs en écriture, sera par exemple d'encadrer toute mise à jour par un bloc beginUpdate / endUpdate avec compteur de référence, ce qui permet lors de la mise en place d'une IHM (Interface Homme Machine) de ne provoquer l'actualisation des champs d'un écran que lorsque la dernière mise à jour aura eu lieu...
Exemple :
- A - Compteur de réf = 0
- B - BeginUpdate - Compteur de réf +1
- C - BeginUpdate - Compteur de réf +1
- D - EndUpdate - Compteur de réf - 1 -> Aucune actualisation écran
- E - EndUpdate - Compteur de réf - 1 -> On actualise tout

Ce processus évite notamment de voir l'écran flasher à chaque mise à jour et évite entre autre de passer par des mises en cache (buffering) consommatrices en ressources.
Merci beaucoup pour toutes vos réponses qui m'ont bien éclairées !!!