7- Les accesseurs et modificateurs

Comme nous savons à présent qu'il vaut mieux encapsuler les données des objets, nous devons apprendre à présent comment intéragir avec celles-ci quand nous en avons besoin de l'extérieur tout de même.

Pour intéragir avec les données (attributs) d'un objet de l'extérieur, il suffit de créer des méthodes publiques dans la classe qui vont retourner (on appelle cela un accesseur, accessor ou getter) les attributs demandés, ou encore les modifier : on appelle alors cela un modificateur, mutator ou setter.

Par exemple, nous voulons forcer que le moteur que nous changeons soit bien de la classe Moteur, et que si l'on remplace une roue on remplace les 4 en même temps.

Exemple de modificateurs avec vérification et d'accesseur

// dans la classe Voiture
public function getRoues() : array
{
    return $this->roues;
}

public function setRoues(array $roues)
{
    // On compte qu'il y a bien 4 roues
    if(count($roues) === 4){
        $count = 0;
        foreach ($roues as $roue){
            // Si chaque roue est bien une instance de la classe Roue, on incrémente le compteur
            if($roue instanceof Roue){
                $count++;
            }
        }

        // Si le compteur est à 4 c'est que les 4 éléments de l'array $roues sont bien des objets Roue, alors on change nos roues
        if($count === 4){
            $this->roues = $roues;
        }
    }
}

public function getMoteur() : Moteur
{
    return $this->moteur;
}

public function setMoteur(Moteur $moteur)
{
    $this->moteur = $moteur;
}

// à l'extérieur de ma classe
$voiture = new Voiture($sieges, $carrosserie);
$roues = [new Roue(), new Roue(), new Roue(), new Roue()];
$voiture->setRoues($roues);

var_dump($voiture->getRoues());
//array(4) {
//[0]=>
//  object(Roue)#11 (0) {
//  }
//  [1]=>
//  object(Roue)#12 (0) {
//  }
//  [2]=>
//  object(Roue)#13 (0) {
//  }
//  [3]=>
//  object(Roue)#14 (0) {
//  }
//}

Et voilà le travail : nous avons bien forcé le moteur à être de la classe Moteur en typant le paramètre du modificateur, puis forcé les 4 roues à être changées en même temps et à être de la classe Roue. De plus, on peut y accéder de l'extérieur pour, par exemple, faire un diagnostique de notre voiture, tout cela en respecant le principe d'encapsulation de la POO.