6- Les modificateurs d'accès

Un des principes clés de la programmation orientée objet est l'encapsulation : cela veut dire que tout ce que l'on utilise d'un objet doit passer par l'interface qu'on lui a créé pour cela. Tout ce que contient l'objet comme données est hermétique à l'extérieur sauf si l'on décide autrement. Cela permet d'éviter beaucoup d'erreur liées à une mauvaise utilisation des attributs de l'extérieur de l'objet.

Par exemple, si le moteur de la voiture est un objet de la classe Moteur et que je peux modifier à ma guise cet attribut de l'extérieur, je pourrais très bien dire $voiture->moteur = 3. Cela n'aurait absolument aucun sens et détruirait la logique de mon objet voiture qui ne fonctionnerait plus du tout.

Pour éviter cela, il est possible de gérer les accès des méthodes et des attributs d'une classe avec les mots-clés public, private et protected.

  • public : peut-être accessible de l'intérieur et de l'extérieur de la classe et de ses descendants.
  • private : ne peut-être accessible que de l'intérieur de la classe.
  • protected : peut-être accessible de l'intérieur de la classe et par ses descendants (directs et indirects). Nous verrons la notion d'ascendant et descendant dans la partie consacrée à l'héritage.

Si, à présent, je mets les attributs de ma classe voiture en privé, je le ferais de la manière suivante :

class Voiture
{
    private $sieges;
    private $carrosserie;
    private $moteur;
    private $roues;

    public function __construct(array $sieges, Carrosserie $carrosserie, Moteur $moteur = null, array $roues = [])
    {
        $this->sieges = $sieges;
        $this->carrosserie = $carrosserie;
        $this->moteur = $moteur ?? new Moteur();
        $this->roues = $roues;
    }
}

Comme nous initialisons les attributs dans le constructeur, nous sommes dans la classe et nous avons le droit d'y accéder même s'ils sont privés. Nous pouvons accéder au constructeur de l'extérieur puisque la méthode est publique.

Néanmoins, il est impossible de faire $voiture->carrosserie = 'toto' à présent car notre attribut ne peut plus être utilisé à l'extérieur de la classe.