Programmation orientée objet en PHP

Auteur: Mohamed CHINY Durée necessaire pour le cours de Programmation orientée objet en PHP Niveau recommandé pour le cours de Programmation orientée objet en PHP Supports vidéo non disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz non disponibles pour ce cours

Page 4: Constructeur et destructeur

Toutes les pages

Le constructeur d'une classe

Le constructeur d'une classe est une méthode publique (dans la plupart des cas). Elle est appelée automatiquement au moment de l'instanciation. Elle sert généralement à initialiser les attributs et fournir à l'objet créé tout ce dont il a besoin pour fonctionner. Cette opération d'initialisation est connue sous le nom d'hydratation.

Le constructeur est une méthode qui a le même nom que la classe. Cependant, en PHP on préfère l'identifier par le mot clé __construct() (avec deux sous-tirets au début).

Examinons le code suivant:
<?php
   class Voiture{
      private $couleur;
      private $puissance;
      private $vitesse;
      public function __construct(){
         $this->couleur="Rouge";
         $this->puissance=130;
         $this->vitesse=0;
      }
      public function accelerer(){
         echo "Appel de la méthode accelerer()";
      }
      public function ralentir(){
         echo "Appel de la méthode ralentir()";
      }
   }

   $citadine = new Voiture();   
?>
Le code est en partie le même que celui de la page précédente. Néanmoins, nous avons déclaré le constructeur du nom de __construct() qui hydrate l'objet qui sera créé au moment de l'instanciation.

En effet, les attributs $couleur, $puissance et $vitesse sont initialisés tous les trois dans le constructeur. Par conséquent, au moment de l’instanciation ($citadine = new Voiture();) le constructeur est appelé et les attributs initialisés.

Je crois que vous avez remarqué le mot clé $this. Il s'agit d'une pseudo-variable qui représente l'objet en cours. Autrement dit, au sein de l'objet $citadine la pseudo-variable $this vaut $citadine, par conséquent:
$this->couleur="Rouge";
revient à dire:
$citadine->couleur="Rouge";
La pseudo-variable $this peut être utilisée dans toutes les méthodes déclarées dans une classe. Elle représenta toujours l'instance de classe (objet) en cours.

Si vous contemplez bien le code précédent, vous allez sûrement vous rendre compte que tous les objets de type Voiture que nous allons créer auront la couleur rouge et une puissance de 130 chevaux. C'est normal, car le constructeur applique ces valeurs statiquement. Pour remédier à ce problème et créer des objets dont les attributs ont des valeurs différentes à chaque fois, on peut songer à créer des méthodes qui se chargeront après de manipuler ces attributs ou, plus simple encore, passer des arguments au constructeur qu'il affectera aux attributs lors de l'instanciation de la classe.

L'exemple précédent peut donc s'écrire ainsi:
<?php
   class Voiture{
      private $couleur;
      private $puissance;
      private $vitesse;
      public function __construct($couleur,$puissance){
         $this->couleur=$couleur;
         $this->puissance=$puissance;
         $this->vitesse=0;
      }
      public function accelerer(){
         echo "Appel de la méthode accelerer()";
      }
      public function ralentir(){
         echo "Appel de la méthode ralentir()";
      }
   }

   $citadine = new Voiture("Rouge",130);   
?>
Notez que les variables passées en argument au constructeur ($couleur et $puissance) n'ont rien à voir avec les attributs du même nom déclarés dans la classe.

Le destructeur d'une classe

Le destructeur et une méthode publique identifiée par le nom __destruct(). Il est appelé automatiquement par le compilateur lorsqu'il n'y a plus aucune référence à l'objet en cours. Autrement dit, le destructeur est appelé quand il n'y a plus aucun appel d'un membre quelconque de l'objet.

Exemple:
<?php
   class Voiture{
      private $couleur;
      private $puissance;
      private $vitesse;
      public function __construct(){
         $this->couleur="Rouge";
         $this->puissance=130;
         $this->vitesse=0;
      }
      public function __destruct(){
         echo "Couleur de la voiture: ".$this->couleur;
      }
      public function accelerer(){
         echo "Appel de la méthode accelerer()";
      }
      public function ralentir(){
         echo "Appel de la méthode ralentir()";
      }
   }

   $citadine = new Voiture();   
?>
Ce qui donne:
Couleur de la voiture: Rouge
Au moment de l'instanciation, l'objet $citadine est hydraté par l'appel automatique du constructeur, c'est à dire que ses attributs sont initialisés. Puisque aucune référence à l'objet $citadine n'est présente après l'instanciation, alors le destructeur est appelé automatiquement et affiche le message "Couleur de la voiture: Rouge".