Dans cette leçon, nous allons découvrir le principe des objets en PHP à travers un exemple concret : la manipulation des dates avec DateTime.
Jusqu'à maintenant, on a travaillé avec les dates sous forme d'entiers, avec des timestamps, ou sous forme de chaînes de caractères. Cela fonctionne, mais dès que l'on veut faire des calculs plus complexes, on doit convertir les valeurs et enchaîner plusieurs fonctions.
Les objets permettent de représenter des concepts plus complexes, avec des méthodes et des propriétés adaptées au type de donnée que l'on manipule.
Comprendre le principe d'un objet
Un objet peut être vu comme un type personnalisé. Il vient compléter les types de base comme :
- les entiers.
- les chaînes de caractères.
- les tableaux.
Pour découvrir cette notion, on va utiliser l'objet DateTime, qui permet de représenter une date.
Dans la documentation, DateTime est présenté comme une classe. On y retrouve plusieurs éléments :
- une déclaration.
- des constantes.
- des méthodes.
Les méthodes ressemblent aux fonctions que l'on a déjà utilisées, mais elles sont liées à un objet précis. Par exemple, une méthode de DateTime ne s'utilise que sur un objet DateTime.
Construire un objet DateTime
Pour créer un objet, on utilise le mot-clé new, suivi du nom de la classe.
Ici, on crée une nouvelle date. Comme aucun paramètre n'est passé au constructeur, PHP utilise la date courante.
Le constructeur correspond à la méthode qui indique comment créer un objet. Dans le cas de DateTime, il peut recevoir une chaîne de caractères représentant une date, ainsi qu'un fuseau horaire. Ces paramètres sont optionnels.
Si on affiche l'objet avec var_dump, PHP indique qu'il s'agit d'un objet de type DateTime et affiche ses propriétés internes.
Utiliser une méthode
Une fonction liée à un objet s'appelle une méthode. Pour appeler une méthode, on utilise la flèche ->.
Par exemple, la méthode format permet d'afficher une date dans un format particulier.
Le format utilisé est le même que celui que l'on utilise avec la fonction date.
On peut comparer avec une approche plus traditionnelle :
Pour ce premier cas, les deux approches donnent le même résultat. L'intérêt des objets devient plus visible lorsque l'on veut modifier des dates ou calculer des écarts.
Modifier une date
L'objet DateTime propose une méthode modify, qui permet de modifier la date avec une expression comme +1 month.
Ici, la méthode modifie directement l'objet $date. On n'a pas besoin de sauvegarder son retour dans une nouvelle variable.
Avec une approche par timestamp, on utiliserait plutôt strtotime :
Les deux solutions permettent d'obtenir une date modifiée, mais l'objet rend la manipulation plus naturelle lorsque les opérations deviennent plus nombreuses.
Calculer l'écart entre deux dates
Imaginons que l'on souhaite calculer le nombre de jours entre deux dates.
Avec une approche procédurale, il faut convertir chaque date en timestamp, faire une soustraction, puis convertir le résultat en jours.
Avec DateTime, on crée deux objets puis on utilise la méthode diff.
La méthode diff retourne un objet DateInterval. Cet objet représente l'écart entre deux dates.
Accéder aux propriétés d'un objet
Un objet peut aussi contenir des propriétés. Pour les lire, on utilise également la flèche ->.
Dans le cas de DateInterval, la propriété days permet de récupérer le nombre total de jours de différence.
On peut enchaîner les appels pour rendre le code plus compact :
Dans la vidéo, l'intérêt mis en avant est surtout la lecture du code : on récupère la différence entre deux dates, puis sur cette différence on récupère le nombre de jours.
Afficher un intervalle plus détaillé
Si les dates sont éloignées de plusieurs années, DateInterval fournit aussi des propriétés utiles comme :
ypour les années.mpour les mois.dpour les jours restants.hpour les heures.
On peut donc afficher un écart de manière plus détaillée sans refaire tous les calculs à la main.
Avec les timestamps, ce type d'affichage demanderait beaucoup plus d'opérations.
Créer un DateInterval
On peut aussi construire manuellement un objet DateInterval.
Dans ce format :
Pindique le début de la période.1Mreprésente un mois.1Dreprésente un jour.Tintroduit la partie liée au temps.1MaprèsTreprésente une minute.
Cet intervalle peut ensuite être utilisé avec la méthode add de DateTime.
On obtient alors une date à laquelle on a ajouté un mois, un jour et une minute.
Pourquoi utiliser des objets ?
Les objets permettent de manipuler des concepts plus riches sous forme de petites briques que l'on peut combiner.
Dans le cas des dates, DateTime représente une date et DateInterval représente une durée ou une différence entre deux dates. Chaque objet regroupe les méthodes et propriétés utiles pour travailler avec ce concept.
L'avantage est double :
- le code est souvent plus naturel à lire.
- la documentation est plus simple à explorer, car les méthodes disponibles sont regroupées par objet.
PHP permet aussi de créer ses propres objets. C'est ce qui permettra ensuite de mieux organiser son code pour représenter les concepts propres à une application.