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.
$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
?>
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
?>
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/hLa voiture rouge n'existe plus.
Test de mémorisation/compréhension
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.
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.
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.
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.