• 10 hours
  • Medium

Free online content available in this course.

course.header.alt.is_video

Paperback available in this course

course.header.alt.is_certifying

Got it!

Last updated on 8/21/23

Découvrez les objets et les classes

Dans “programmation orientée objet”, il y a le mot objet (appelez-moi Sherlock Holmes). En programmation, objet est le nom que l’on donne à l'élément : 

  • qui se trouve dans une variable ;

  • dans lequel on peut stocker des valeurs ;

  • et auquel on peut demander de faire des actions

Pour faire simple, c’est un regroupement de valeurs et de fonctions.

Pour obtenir un objet, il faut demander au langage de le créer et de nous le donner pour qu’on puisse le manipuler. Pour faire ça, on précise au langage le nom de l’élément que l’on veut manipuler, c’est-à-dire la classe.

Qu’est-ce qu’une classe ?

Une classe est une définition qui contient le nom des propriétés qu’on pourra manipuler ainsi que des méthodes. Les propriétés, ce sont des variables internes à cette définition dans lesquelles on stocke des valeurs. Une classe a aussi des méthodes : il s’agit de fonctions internes à la classe. La classe détermine ce qu'il sera possible de faire avec l'objet.

Le fait de créer un objet à partir d’une classe s’appelle instancier une classe.

Pour vous donner un exemple plus concret, imaginons que vous souhaitez modéliser des voitures. Nous aurions une classe Voiture. Cette classe est notre mode d’emploi et possèdera un ensemble de caractéristiques, les propriétés (un type de moteur, une vitesse maximale, une couleur, un nombre de portes, etc) et un ensemble de fonctionnalités, les méthodes (rouler, freiner, klaxonner, etc).  Nous aurions également des objets, qui seront des instances de la classe Voiture : par exemple une voiture rouge, de type Diesel possédant 3 portes. Chaque voiture serait alors un objet, qui serait toutes différentes (à l’inverse de la classe, qui est unique).

Essayons ça dès maintenant. 😎

Instanciez votre première classe

Le langage PHP propose déjà plusieurs classes par défaut, comme DateTime. Pour utiliser cette classe, vous devez l'appeler par son nom, précédé du mot clé new.

<?php

$date = new DateTime;

‌On vient d’instancier la classeDateTime! Qu’est-ce qu’on peut dire de plus ?

Eh bien, qu'il a fallu assigner l'instance   DateTime  à une variable, ici $date, pour pouvoir la manipuler. Si je ne le fais pas, alors j’aurai juste demandé au langage de générer l’objet et de le détruire immédiatement.

Découvrez ce qu'est une instance

Bon, nous avons créé une instance, mais qu’est-ce que ça veut dire, exactement ? Créer une instance, c'est créer un objet à partir d'une classe, ça vous le savez déjà. Et en PHP, cette création est le résultat de trois opérations : 

  • l’allocation et l'initialisation de données ;

  • le stockage en mémoire du nouvel objet pour suivre son état ;

  • la construction d’une référence de l’objet pour le manipuler. 

Revenons sur la notion de référence. Pour rappel, lorsque vous passez une variable en paramètre d’une fonction, PHP en fait une copie par défaut. Par exemple, à l’exécution de ce code, la variable $a n’a pas changé : 

<?php

// déclaration par référence avec le symbole &
function foo($var) {
    $var = 2;
}


$a=1;
foo ($a);
// $a vaut toujours 1

Si vous souhaitez pouvoir modifier la variable au sein de la fonction, vous pouvez ajouter le symbole &  pour indiquer au langage de ne pas copier la valeur dans votre fonction, mais plutôt de manipuler directement la variable d’origine.

<?php

// déclaration par référence avec le symbole &
function foo(&$var) {
    $var = 2;
}
 
$a=1;
foo ($a);
 
// $a vaut 2 maintenant

Si vous je parle de référence, c’est parce qu’en PHP, c’est un peu différent pour les objets. Ils sont toujours passés par référence aux différentes fonctions. Je manipule toujours le même objet en mémoire. Je n’ai pas besoin du&.

<?php
 
// déclaration de référence à l’objet
function foo(DateTime $date) {
    $date->modify('+1 day'); // permet d'ajouter 1 jour à la date
}
 
$date = new DateTime;
foo ($date);
 
// $date est maintenant au lendemain

Si vous n’êtes pas familier avec la syntaxe utilisée en ligne 5, n’ayez crainte, nous y revenons juste après. L’important ici est de comprendre que notre objet $date, créé à l’extérieur de la fonction foo est modifié au sein de cette fonction.

D’ailleurs, même si je l’assigne plusieurs fois, en réalité, je fais encore référence au même objet.

<?php
 
$dateUne = new DateTime;
$dateDeux = $dateUne;
 
$dateDeux->modify('+1 day');
 
var_dump($dateUne, $dateDeux);
 
// $dateUne et $dateDeux désignent le même objet en mémoire.
// Ils sont donc tous les deux au lendemain

Tester ce code.

Utilisez les fonctionnalités d'un objet

Pour rappel, les objets possèdent des propriétés (variables) et des méthodes (fonctions). Pour y accéder, il faut utiliser le symbole ->   à la suite de la variable, comme dans l’exemple suivant :

<?php
 
$date = new DateTime;
echo $date->format('d/m/Y');

Tester ce code.

Dans cet exemple, j’utilise echo  pour afficher le résultat du retour de la méthode  format  de l'objet  $date  (on parle de méthode dès qu'une fonction est associée à un objet). J’aurais aussi pu stocker le résultat de cette méthode dans une variable, ça s'utilise vraiment comme une fonction, sauf qu’il faut passer par un objet.

Dans ces cas-là, ça peut être une nouvelle instance, ou l'instance que vous êtes en train de manipuler directement.

Pourquoi faire ?

Retourner une instance offre la possibilité d'effectuer du chaînage. C'est-à-dire enchaîner les appels à différentes méthodes les unes à la suite des autres, sans avoir à faire référence à la variable. Comme ça :

<?php
 
// D’abord, l’exemple sans chaînage :
$date = new DateTime;
$newDate = $date->modify('+1 day');
 
echo $date->format('d/m/Y').PHP_EOL;
echo $newDate->format('d/m/Y').PHP_EOL;
 
// Maintenant avec le chaînage. Nous exploitons directement
// l'objet qui nous est retourné sans le stocker dans une variable :
$formatedDate = $date->modify('+1 day')->format('d/m/Y');
echo $formatedDate.PHP_EOL;

Tester ce code

Ici, la méthode modify  nous renvoie l'instance de DateTime, modifiée avec 1 jour de plus. Vu qu'elle renvoie sa propre instance, que contient $newDate

On a vu ensemble que quand vous assignez un objet à 2 variables, vous manipulez toujours le même objet. C’est pareil ici. Vous n’obtenez pas une copie de $date. Cette variable pointe (fait référence à) vers le même objet, la même allocation mémoire, que$date.

Aux lignes 7 et 8, les deux valeurs sont bien identiques. Vous pouvez vous amuser à effectuer l'opération dans les deux sens pour vous familiariser avec cet usage – voici un exemple.

‌D'autres objets vous renverront de nouvelles instances, qu'il s'agisse d'une instance de leur propre classe, ou d'une toute autre classe. Comme par exemple avec la classe DateTimeImmutable, dont le but est de laisser l'objet original intact.

<?php
 
$date = new DateTimeImmutable;
$newDate = $date->modify('+1 day');
 
echo $date->format('d/m/Y').PHP_EOL;
echo $newDate->format('d/m/Y').PHP_EOL;

Tester ce code

Nous observons ici que $date  n’est pas changé lorsque nous appelons la méthode  modify , mais que la date du lendemain est retournée dans  $newDate) uniquement. Il s’agit de l’unique différence entre les classes   DateTime  et DateTimeImmutable.

Créez un objet à partir de (presque) rien

Lorsque vous manipulez des chaînes au format JSON et que celui-ci comprend la définition d'un objet, par exemple :

{
    "date":"2021-03-23 07:35:44.011207",
    "timezone_type":3,
    "timezone":"Europe/Paris"
}

‌... PHP n'a aucune indication. Il ne connaît pas la classe dont ces valeurs sont issues. Pourtant, lorsque vous allez lui demander de transformer cette chaîne en objet, il va y arriver :

<?php
 
$s = ‘
{
    "date":"2021-03-23 07:35:44.011207",
    "timezone_type":3,
    "timezone":"Europe/Paris"
}
‘;

var_dump(json_decode($s));

Tester ce code

Vous allez obtenir un objet issu de la classe stdClass.

Comment fait PHP pour assigner des valeurs à un objet avec des propriétés qui n'ont pas été définies ?

PHP est un langage extrêmement permissif. Il autorise d'ajouter des propriétés à la volée. Tout comme il permet aux variables de changer de type au cours de leur vie dans un script.

Pour éviter d’arrêter l’exécution du script par manque de connaissance, et d’afficher une erreur, lorsqu'aucune classe n'est spécifiée, PHP utilisera la classe  stdClass. Par ailleurs, vous pouvez tout à fait instancier cette classe manuellement.

‌En résumé

  • En programmation orienté objet, une classe est un modèle ou un mode d’emploi tandis que les objets sont les objets créés à partir de ce modèle

  • Une classe possède un ensemble de variables, appelées propriétés ainsi qu’un ensemble de fonctions appelées méthodes.

  • Il est possible de créer une classe à partir d’une classe grâce au mot-clé   new . On appelle cela une instance.

  • Pour accéder aux propriétés ou aux méthodes d’une classe, on utilise le symbole  ->.

Maintenant que nous avons vu comment instancier une classe et manipuler un objet, on va les personnaliser ! Suivez-moi au prochain chapitre.

Example of certificate of achievement
Example of certificate of achievement