Les class

Résumé Support Quiz

Dans ce chapitre, nous allons voir comment créer nos propres objets en PHP. L'objectif est de comprendre comment une classe permet de représenter un concept de l'application en regroupant au même endroit ses données et les opérations associées.

Cette approche évite de manipuler des structures trop génériques, comme des tableaux dont il faut se souvenir de l'organisation exacte, ou de disperser la logique dans un fichier rempli de fonctions globales. Avec une classe, on donne un nom clair à un concept et on définit son comportement.

Créer une première classe

Pour organiser le code, on peut créer un dossier dédié aux classes. Chaque classe est ensuite placée dans son propre fichier. Il y a une convention importante à respecter : le fichier porte le même nom que la classe, et le nom de la classe commence par une majuscule.

<?php class Creneau { }

Le mot-clé class permet de définir un nouveau type d'objet. À partir du moment où cette classe est chargée, on peut créer des objets à partir de cette définition, comme on le ferait avec des objets déjà fournis par PHP.

<?php require __DIR__ . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'Creneau.php'; $creneau = new Creneau(); var_dump($creneau);

En exécutant le fichier depuis le terminal, PHP indique que l'on a bien créé un objet du type défini par la classe.

php cli/test.php

Classe, instance et instanciation

Une classe décrit le fonctionnement d'un objet. Elle sert de modèle : elle indique quelles informations l'objet peut contenir et quelles actions il peut effectuer.

Quand on utilise le mot-clé new, on crée un nouvel objet à partir de cette classe. Cette action s'appelle une instanciation, et l'objet obtenu est une instance de la classe.

$creneau = new Creneau(); $creneau2 = new Creneau();

Chaque appel à new crée une instance indépendante. Deux objets créés à partir de la même classe partagent la même définition, mais leurs valeurs restent séparées.

Cette terminologie est importante, car on la retrouve partout en programmation orientée objet :

  • la classe décrit le modèle.
  • l'instance est l'objet réellement créé avec new.
  • l'instanciation correspond à l'action de créer cette instance.

Ajouter des propriétés

Un objet peut contenir des informations. Ces informations sont stockées dans des propriétés, que l'on déclare à l'intérieur de la classe.

<?php class Creneau { public $debut; public $fin; }

Le mot-clé public sera expliqué plus tard, mais il permet ici de déclarer des propriétés accessibles sur l'objet. Comme pour une variable, on peut choisir de leur donner une valeur par défaut. Si on ne le fait pas, leur valeur initiale sera null.

On peut ensuite modifier les propriétés d'une instance :

$creneau = new Creneau(); $creneau2 = new Creneau(); $creneau->debut = 9; $creneau->fin = 12; var_dump($creneau, $creneau2);

La modification ne concerne que l'objet sur lequel on agit. Une autre instance de la même classe conserve ses propres valeurs. C'est un point essentiel : chaque objet fonctionne de manière indépendante.

Initialiser un objet avec un constructeur

Dans beaucoup de cas, on veut pouvoir fournir les premières valeurs d'un objet dès sa création, plutôt que de créer l'objet puis de remplir ses propriétés ligne par ligne.

$creneau = new Creneau(9, 12); $creneau2 = new Creneau(14, 16);

Pour faire cela, on utilise une méthode spéciale : le constructeur. Une méthode est simplement une fonction définie à l'intérieur d'une classe. Le constructeur, lui, doit s'appeler __construct et il est automatiquement appelé lors de l'instanciation.

<?php class Creneau { public $debut; public $fin; public function __construct(int $debut, int $fin) { $this->debut = $debut; $this->fin = $fin; } }

À l'intérieur d'une méthode, $this permet de faire référence à l'instance courante. On l'utilise pour lire ou modifier les propriétés de l'objet sur lequel la méthode est appelée.

Le fait que les paramètres aient le même nom que les propriétés n'est pas un problème, car on ne les utilise pas de la même manière :

  • $debut désigne le paramètre reçu par la méthode.
  • $this->debut désigne la propriété de l'objet courant.

Ajouter une méthode à l'objet

L'intérêt d'une classe n'est pas seulement de stocker des valeurs. Elle peut aussi contenir les opérations qui ont du sens pour le concept représenté. Ces opérations sont définies sous forme de méthodes.

$creneau->includeHour(10); $creneau2->includeHour(10);

Une méthode se définit comme une fonction, mais à l'intérieur de la classe :

public function includeHour(int $heure): bool { return $heure >= $this->debut && $heure <= $this->fin; }

On n'a pas besoin de passer l'objet courant en paramètre. La méthode est appelée sur une instance, et $this permet d'accéder automatiquement aux propriétés de cette instance. On peut aussi préciser le type de retour, ici bool, pour indiquer que la méthode renvoie true ou false.

Passer un objet en paramètre

Une méthode peut aussi travailler avec un autre objet. Dans ce cas, on peut typer un paramètre avec le nom d'une classe. Le typage ne se limite donc pas aux entiers, chaînes de caractères ou tableaux : on peut aussi utiliser nos propres types d'objets.

public function intersect(Creneau $creneau): bool { return $this->includeHour($creneau->debut) || $this->includeHour($creneau->fin) || ($this->debut >= $creneau->debut && $this->fin <= $creneau->fin); }

Dans cette méthode, il faut distinguer deux éléments :

  • $this, qui représente l'instance courante.
  • $creneau, qui représente l'objet reçu en paramètre.

Cela permet de comparer deux instances entre elles et de construire des comportements plus complexes à partir des méthodes déjà disponibles.

var_dump($creneau->intersect($creneau2));

L'avantage est que la logique reste attachée à la classe concernée. On évite ainsi de multiplier les fonctions globales qui nécessitent de passer toutes les informations à chaque appel.

Regrouper la logique liée à un concept

Une classe peut continuer à être enrichie avec toutes les méthodes utiles au concept qu'elle représente. Il peut s'agir de méthodes de vérification, de comparaison ou même de génération d'affichage.

public function toHTML(): string { return "<strong>{$this->debut}h</strong> à <strong>{$this->fin}h</strong>"; }

On peut ensuite appeler cette méthode directement sur l'objet :

echo $creneau->toHTML();

L'intérêt est de garder au même endroit les données et les comportements qui vont ensemble. Le code devient plus lisible, car on sait où chercher les méthodes disponibles pour un concept donné. Cela permet aussi de découper la logique de l'application en plusieurs fichiers et en plusieurs objets, plutôt que de tout regrouper dans un seul fichier functions.php.

Les classes deviennent particulièrement utiles dès qu'un concept doit être réutilisé à plusieurs endroits de l'application, ou lorsque plusieurs instances doivent fonctionner de manière indépendante tout en partageant le même comportement.

Ressources

Pour aller plus loin, vous pouvez consulter la documentation officielle PHP sur les classes et objets.