Le constructeur et le destructeur
Petite vérification
Avant de commencer, vérifiez si vous savez...
- écrire la déclaration PHP d'une classe nommée
Veloavec une propriété publique$couleur - écrire l'instruction PHP qui crée un objet (une instance) de la classe
Voiture, stocké dans une variable$maVoiture - expliquer la différence entre une classe et un objet, en utilisant les mots "modèle" et "instance"
📌 Réponse attendue
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.