Constructeur, destructeur et autres fonctions spéciales



En plus des fonctions que nous avons créées dans notre classe Membre, il existe un certain nombre de fonctions « spéciales » qu'il vous faut connaître. On les appelle fonctions magiques ou encore méthodes magiques.

On les reconnaît facilement car leur nom commence par deux underscores (tiret bas, sous le chiffre 8 d'un clavier AZERTY français). Par exemple :  __construct,  __destruct,  __get, etc.


Ici, nous allons nous intéresser plus particulièrement aux deux plus importantes d'entre elles : le constructeur et le destructeur.


Le constructeur :  __construct


Lorsque vous créez un objet, comme nous l'avons fait précédemment, celui-ci est vide au départ. Ses variables membres ne contiennent rien. Ainsi notre membre n'avait pas de pseudo, pas d'adresse e-mail, rien.

<?php

$membre = new Membre(); // Le membre est vide

?>


Or, quand vous créez un objet comme cela avec new, il faut savoir que PHP recherche à l'intérieur de la classe une fonction nommée __construct. Jusqu'ici nous n'en avions pas créé : donc faute d'en trouver, PHP créait un objet vide.


Le rôle d'une fonction constructeur est justement de construire l'objet (non, sans blague !), c'est-à-dire de le préparer à une première utilisation. Dans notre cas, on aimerait par exemple charger en base de données les informations concernant le membre et insérer les bonnes valeurs dans les variables dès le départ.

<?php

class Membre

{

    public function __construct($idMembre)

    {

        // Récupérer en base de données les infos du membre

        // SELECT pseudo, email, signature, actif FROM membres WHERE id = ...

         

        // Définir les variables avec les résultats de la base

        $this->pseudo = $donnees['pseudo'];

        $this->email = $donnees['email'];

        // etc.

    }

 

    ...

?>


Notre fonction constructeur prend un paramètre : l'id du membre. À partir de là, on peut charger en base de données les informations concernant le membre et les insérer dans l'objet : $this->pseudo$this->email

Comme notre constructeur prend un paramètre, il faudra désormais créer nos objets en envoyant un id :

<?php

$membre = new Membre(32); // Le membre n° 32 est chargé !

?>

Notre membre no 32 est maintenant prêt !


Il contient déjà le bon pseudonyme, la bonne adresse e-mail, etc. À vous de faire en sorte ensuite, lorsqu'on modifie par exemple son pseudo, que ce changement soit bien répercuté en base de données.


Le destructeur :  __destruct


Moins couramment utilisé, le destructeur peut néanmoins se révéler utile. Cette fonction est appelée automatiquement par PHP lorsque l'objet est détruit.


Mais quand l'objet est-il détruit ?


Pour détruire un objet, ou toute autre variable, on peut le faire à la main avec la fonction unset() :

<?php

unset($membre);

?>


Si vous ne le faites pas, l'objet sera détruit à la fin de l'environnement dans lequel il a été créé. Si l'objet a été créé dans la page (comme c'était le cas dans index.php), il sera supprimé à la fin de l'exécution de la page.

C'est alors que le destructeur est appelé. Son rôle est de réaliser toutes les opérations nécessaires pour mettre fin à la vie de l'objet.


La classe PDO, par exemple, a besoin d'utiliser le destructeur pour fermer la connexion à la base de données. Elle envoie alors un signal à la base de données : « Fin de la connexion ».

Dans le cas de notre classe Membre, il n'y aurait rien de spécial à faire a priori. Néanmoins, pour tester le fonctionnement du destructeur, vous pouvez en créer un qui affiche un message signalant que l'objet va être détruit :

<?php

public function __destruct()

{

    echo 'Cet objet va être détruit !';

}

?>

Vous verrez que ce message apparaît à la fin de la page dans notre cas. Si vous avez créé plusieurs objets, vous verrez autant de messages qu'il y a d'objets, car chacun d'eux va être détruit !


Les autres fonctions magiques


Il existe de nombreuses autres fonctions magiques dont l'utilité est cependant moins importante :__get()__set()__call()__sleep()__wakeup()… Elles permettent de contrôler certaines autres étapes de la vie de votre objet.

Nous ne les détaillerons pas ici mais si vous voulez en savoir plus sur elles, vous pouvez lire la page de la documentation qui présente les fonctions magiques.

Créé avec HelpNDoc Personal Edition: Documentation Qt Help facile