5- Les objets

L'instanciation

Une classe telle qu'elle ne peut pas être utilisée, c'est juste un modèle, un moule (sauf si elle est statique).

Une classe non statique doit donc être instanciée pour créer un objet qui sera stocké dans une variable et pourra être utilisé.

Chaque classe possède une méthode qui permet de l'instancier, c'est à dire de retourner l'objet créé. Cette méthode s'appelle un constructeur, noté __construct(). En PHP, le constructeur par défaut est caché et il est déclaré implicitement, voilà pourquoi on peut créer un objet sans devoir écrire le constructeur. Néanmoins, nous le réécrivons souvent pour y ajouter des paramètres.

Par exemple, le constructeur de notre classe voiture s'écrira comme cela :

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

    public function __construct(){

    }

    public function accelerer(){

    }

    public function freiner(){

    }

    public function tourner(string $sens) : bool{
        $fonctionne = false;

        // nous vérifions si le sens de rotation est un sens attendu
        if($sens === "gauche" || $sens === "droite"){
            $fonctionne = true;
        }

        return $fonctionne;
    }
}

Pour utiliser notre constructeur et instancier un objet voiture, il faut utiliser le mot-clé new.

Exemple de création d'un objet voiture :

$voiture = new Voiture();

Dans cet exmple, $voiture est une instance unique de la classe voiture. Lorsque l'on voudra utiliser notre voiture, nous allons donc utiliser la variable $voiture.

Admettons à présent que nous avons déjà créé des moteurs, des sièges, des carrosseries et des roues, et que nous voulons les ajouter à notre voiture à sa construction. Nous allons donc les passer en paramètre dans le constructeur.

Dans certains langages, il est possible de créer plusieurs constructeurs pour une même classe avec différents paramètres : ajouter des paramètres à une fonction s'appelle une surcharge ou un override. Lorsqu'on réécrit complètement la fonction, cela s'appelle une réécriture ou rewrite (nous verrons cela avec l'héritage). En PHP on ne déclare qu'un constructeur auquel on peut ajouter des valeurs par défaut.

Exemple de constructeur avec paramètres

class Voiture
{
    public $sieges;
    public $carrosserie;
    public $moteur;
    public $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;
    }
}

Dans ce constructeur, nous sommes obligés de passer en paramètre un array de sièges et un objet Carrosserie, et nous pouvons en plus, au choix ajouter un objet Moteur et un array de roues. Nous pouvons donc très bien instancier notre voiture de toutes les manières suivantes :

// Instancions les composants de la voiture
$moteur = new Moteur();
$sieges = [new Siege(), new Siege()];
$carrosserie = new Carrosserie();
$roues = [new Roue(), new Roue(), new Roue(), new Roue()];

// Maintenant, créons nos voitures
$voiture = new Voiture($sieges, $carrosserie, $moteur, $roues);
$voiture = new Voiture($sieges, $carrosserie, $moteur);
$voiture = new Voiture($sieges, $carrosserie);
$voiture = new Voiture([new Siege(), new Siege()], new Carrosserie());

Intéragir dans la classe avec l'instance

Dans l'exemple précédent, nous utilisons le mot-clé $this pour désigner l'instance de la classe en cours. Ainsi $this->carrosserie désigne la carosserie de l'objet voiture, alors que $carrosserie désigne le paramètre du constructeur qui est passé à l'instanciation (il provient donc de l'extérieur de l'objet).

Pour intéragir avec tout ce qui est contenu dans l'objet, il faut donc utiliser $this quand nous sommes à l'intérieur de la classe, que ce soit pour les attributs ou les méthodes.

Par exemple dans une méthode garer, nous pourrions trouver :

// dans la classe Voiture
public function garer() : void{
    $this->freiner();
    $this->tourner();
}

Notez que l'opérateur d'appartenance à un objet ou une classe est -> en PHP alors que dans d'autres langages c'est ., mais le point est déjà l'opérateur de concaténation en PHP.

Intéragir hors de la classe avec l'objet

Pour intéragir avec les attributs et les méthodes hors de la classe, il suffit d'utiliser nos méthodes et attributs publics avec la variable qui contient l'objet.

Cela pourrait donner :

$voiture = new Voiture($sieges, $carrosserie, $moteur, $roues);
$voiture->tourner();
$voiture->accelerer();
$voiture->freiner();

Nous pouvons également utiliser les attributs publics de la manière suivante :

$voiture->moteur = new Moteur();
$carrosserie = $voiture->carrosserie;

Néanmoins, il est déconseillé d'accéder directement aux attributs d'une classe en dehors de celle-ci.