Aller au contenu principal

Le constructeur et le destructeur

Partie théorique

Un objet a un cycle de vie : il est créé, il vit pendant l'exécution du programme, puis il est détruit. PHP propose deux méthodes spéciales pour intervenir à ces deux moments précis : le constructeur et le destructeur.

Le constructeur __construct()

Définition : Le constructeur est une méthode spéciale, nommée __construct(), qui est appelée automatiquement au moment où l'on crée un objet avec le mot-clé new.

Explication : Le constructeur sert le plus souvent à initialiser les propriétés de l'objet dès sa création, pour éviter d'avoir un objet dans un état incomplet. On y utilise le mot-clé $this pour affecter les valeurs reçues aux propriétés de l'objet.

info

$this désigne l'objet en cours de création. Nous étudierons ce mot-clé en détail dans la prochaine séance ; retenez pour l'instant qu'il permet d'accéder aux propriétés de l'objet depuis l'intérieur d'une de ses méthodes.

Exemple :

<?php
class Voiture {
public $couleur;
public $vitesse;

// Le constructeur est appelé automatiquement à la création de l'objet
public function __construct($couleur, $vitesse) {
$this->couleur = $couleur;
$this->vitesse = $vitesse;
}
}

// Le constructeur s'exécute ici, avec "rouge" et 0 comme arguments
$maVoiture = new Voiture("rouge", 0);
print($maVoiture->couleur); // Affiche : rouge
?>

Sans constructeur, il faudrait affecter chaque propriété une par une après la création de l'objet, avec le risque d'en oublier une.

Les paramètres du constructeur

Comme pour n'importe quelle fonction, un constructeur peut recevoir des paramètres, et ces paramètres peuvent avoir une valeur par défaut.

<?php
class Voiture {
public $couleur;
public $vitesse;

public function __construct($couleur, $vitesse = 0) {
$this->couleur = $couleur;
$this->vitesse = $vitesse; // 0 si aucune valeur n'est fournie
}
}

$voiture1 = new Voiture("bleue"); // vitesse vaut 0 par défaut
$voiture2 = new Voiture("verte", 50); // vitesse vaut 50
?>
astuce

Donner une valeur par défaut à un paramètre du constructeur permet de créer un objet même quand on ne connaît pas encore toutes ses caractéristiques.

Le destructeur __destruct()

Définition : Le destructeur est une méthode spéciale, nommée __destruct(), qui est appelée automatiquement juste avant que l'objet ne soit détruit : soit parce qu'il n'est plus utilisé nulle part dans le programme, soit parce que le script se termine.

Explication : Le destructeur est beaucoup plus rarement utilisé que le constructeur. Il sert typiquement à :

  • libérer une ressource ouverte par l'objet (fichier, connexion réseau...) ;
  • enregistrer une trace (logger) indiquant que l'objet a terminé son cycle de vie.

Exemple :

<?php
class Voiture {
public $couleur;

public function __construct($couleur) {
$this->couleur = $couleur;
print("La voiture {$this->couleur} est créée.\n");
}

// Le destructeur est appelé automatiquement à la destruction de l'objet
public function __destruct() {
print("La voiture {$this->couleur} est détruite.\n");
}
}

$maVoiture = new Voiture("rouge");
// ... utilisation de $maVoiture ...
// Le destructeur s'exécute automatiquement à la fin du script
?>
attention

Contrairement au constructeur, le destructeur n'a jamais de paramètre. On ne peut pas non plus prévoir précisément à quel instant il sera appelé si l'objet n'est plus référencé par aucune variable avant la fin du script.

Exemple pratique

<?php
class Voiture {
public $couleur;
public $vitesse;

public function __construct($couleur, $vitesse = 0) {
$this->couleur = $couleur;
$this->vitesse = $vitesse;
print("Nouvelle voiture {$this->couleur} créée.\n");
}

public function __destruct() {
print("La voiture {$this->couleur} n'existe plus.\n");
}
}

$maVoiture = new Voiture("rouge", 30);
print("Vitesse actuelle : {$maVoiture->vitesse} km/h\n");

Résultat affiché :

Nouvelle voiture rouge créée.
Vitesse actuelle : 30 km/h
La voiture rouge n'existe plus.

Test de mémorisation/compréhension


Quand le constructeur d'une classe est-il appelé en PHP ?


Comment nomme-t-on la méthode constructeur en PHP ?


À quoi sert principalement un constructeur ?


Un paramètre du constructeur peut-il avoir une valeur par défaut ?


Quand le destructeur d'une classe est-il appelé en PHP ?


Comment nomme-t-on la méthode destructeur en PHP ?


Le destructeur peut-il recevoir des paramètres ?



TP pour réfléchir et résoudre des problèmes

Objectif du TP : Créer une classe Animal qui utilise un constructeur pour s'initialiser et un destructeur pour signaler sa fin de vie.

Étape 1 — Créer le constructeur de la classe Animal

Créez une classe Animal avec deux propriétés publiques $nom et $espece. Complétez son constructeur pour qu'il initialise ces deux propriétés à partir des paramètres reçus.


Bonne pratique - Toujours initialiser ses propriétés

Utilisez le constructeur pour garantir qu'un objet possède toujours des propriétés valides dès sa création. Un objet créé sans ses informations essentielles peut provoquer des erreurs difficiles à repérer plus tard dans le programme.

Étape 2 — Ajouter une valeur par défaut

Modifiez le constructeur pour que le paramètre $espece prenne la valeur "inconnue" si aucune valeur n'est fournie à la création de l'objet.


Bonne pratique - Des valeurs par défaut pertinentes

Choisissez une valeur par défaut qui a du sens pour votre application (ici "inconnue" plutôt qu'une chaîne vide) : cela évite d'afficher des informations incompréhensibles pour l'utilisateur final.

Étape 3 — Ajouter un destructeur

Ajoutez à la classe Animal un destructeur qui affiche un message indiquant que l'animal (avec son nom) n'existe plus.


Bonne pratique - Un destructeur simple et prévisible

Gardez le code d'un destructeur simple et rapide (afficher un message, fermer une ressource). Comme son moment d'exécution exact est difficile à prévoir, évitez d'y placer une logique complexe dont le résultat serait critique pour la suite du programme.

📌 Une solution