• 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

Créez vos propres classes

Maintenant que vous savez instancier une classe et manipuler un objet, il est temps d'apprendre à créer les vôtres :)

Découvrez la syntaxe des classes en PHP

Une classe se déclare de la manière suivante :

<?php

class NomDeLaClasse
{
}

Le mot clé class suivi d'un nom en PascalCase, un retour à la ligne, suivi d'une paire d'accolades. Le code de notre classe se trouvera entre les accolades. 

‏Pour instancier une classe, rien ne change. :)

<?php

class Pont
{
}

$pont = new Pont;

Tester ce code

Ajoutez des propriétés et y accéder

Comme vu précédemment, vous pouvez tout à fait utiliser les capacités dynamiques de PHP, et pas déclarer les propriétés utilisées. Toutefois, cela n’est pas recommandé : votre code perd en maintenabilité et lisibilité. Cela complexifie la compréhension du code pour vous, et vos éventuels collègues.

L'autre intérêt de déclarer nos propriétés, c'est que nous allons pouvoir typer nos propriétés, c’est-à-dire garantir qu'elles contiennent bien la valeur attendue. Ça vous protège d'un mauvais usage de vos classes.

Ajoutons une propriété définissant la longueur de notre pont :

<?php

declare(strict_types=1);

class Pont
{
   public float $longueur = 0;
}

$pont = new Pont;
$pont->longueur = 263.0;

var_dump($pont);

Tester ce code

Attendez, qu’est-ce qu’on vient d’ajouter ? 

En ligne 3 se trouve une instruction demandant à PHP d'être exigeant avec le typage. Le mot clédeclare permet d'indiquer à PHP un comportement spécifique pour le fichier dans lequel nous nous trouvons. Si vous êtes curieux, d'autres instructions existent dans la documentation PHP

En ligne 7 se trouve la déclaration de la propriété. Elle se compose : 

  • du mot clépublic, afin de définir l'accessibilité de la propriété, nous y reviendrons ; 

  • du type de la propriété, ici float (ce n’est pas obligatoire mais c’est une très bonne pratique) ;

  • et enfin, du nom de la propriété préfixé du symbole$. Ce symbole est présent pour la même raison que la déclaration de vos variables : pour distinguer la propriété de la constante

Sur cette même ligne vous pouvez constater que la propriété aura pour valeur 0 si je ne précise rien.

En ligne 11 nous assignons la valeur pour notre instance$pont

Essayez de changer la valeur par une chaîne de caractère, quelle erreur obtenez-vous ? A vous de tester !

À présent, commentons la ligne 3, et vous pouvez essayer à nouveau de changer la valeur par une chaîne de caractères numériques :

<?php

// declare(strict_types=1);

class Pont
{
   public float $longueur = 0;
}

$pont = new Pont;
$pont->longueur = '263.0';

var_dump($pont);

Tester ce code

En effet, cette fois-ci PHP accepte, mais regardez bien le résultat du var_dump : PHP vous indique encore que le contenu de la propriété est unfloat. Le langage fait la conversion pour vous, ce qui peut avoir des résultats inattendus si vous n'êtes pas attentif ! Voilà pourquoi je vous conseille de toujours activer ledeclare(strict_types=1); dans vos fichiers.

Pour vraiment comprendre pourquoi j’insiste sur son usage, essayez l'opération suivante :

<?php

var_dump('1Acarré' + '2Ab');

Tester ce code

Il y a des alertes, certes, mais la plupart du temps celles-ci sont masquées lorsque l'application est en ligne. Mais plus important, PHP s'est entièrement moqué des caractères pour ne conserver que les nombres et effectuer l'opération.

Ajouter l'instructiondeclare(strict_types=1); ne vous sauvera pas ici, il est trop tard. C'est pour cette raison qu'il faut vous protéger au moment de l'assignation des valeurs :)

Méfiez-vous des opérations mathématiques en PHP (pas uniquement en PHP d'ailleurs), les résultats peuvent parfois être surprenants. Ce n'est pas particulièrement lié au langage, puisqu'on retrouve les mêmes comportements ailleurs, mais plutôt d'ordre de choix technique. Je vous invite à aller voir l'excellente présentation de Benoît Jacquemont à ce sujet (en anglais).

Ajoutez des méthodes et les utiliser

Se contenter de propriétés, ce serait dommage. Une classe peut définir des fonctions qu'elle seule sera en capacité d'exécuter. Sans les classes, vous vous retrouverez très probablement avec des fichiers très imposants dans lesquels vous devez fouiller pour retrouver les fonctions nécessaires. 

Même en vous organisant en plusieurs fichiers, il y a une limite pour laquelle il devient difficile pour nos cerveaux de suivre. Un bon moyen c'est de regrouper les fonctionnalités de manière logique, et les classes sont parfaites pour ce rôle

Reprenons l’exemple du pont de notre précédente section. Nous souhaitons pouvoir calculer la surface du pont. Pour cela nous avons besoin de connaître, en plus de la longueur, la largeur du pont. Ajoutons une nouvelle propriétélargeur à notre pont et calculons la surface :

<?php


declare(strict_types=1);

class Pont
{
   public float $longueur;
   public float $largeur;
}

$pont = new Pont;
$pont->longueur = 286.0;
$pont->largeur = 15.0;

$surface = $pont->longueur * $pont->largeur;

var_dump($surface);

Tester ce code

A la ligne 15 nous pouvons voir que nous accédons à nos propriétés par la même syntaxe que lorsque nous avions voulu leur assigner des valeurs avec la flèche ->. Puis nous stockons le résultat de la multiplication dans la variable $surface.

Pour éviter d’avoir à faire le calcul de la surface plusieurs fois, il peut être intéressant de créer une fonction dédiée à cette tâche.  Cette fonction est rattachée à notre classe Pont, on appelle donc cela une méthode :

<?php

declare(strict_types=1);

class Pont
{
   public float $longueur;
   public float $largeur;
  
   public function getSurface(): float
   {
       return $this->longueur * $this->largeur;
   }
}

Tester ce code

Que constate-t-on ?

  • La méthodegetSurface() est déclarée en commençant par sa visibilité "public". Nous y reviendrons au prochain chapitre. 

  • Puis le mot cléfunction suivi d'un nom. Ce nom doit suivre cette fois-ci la nomenclature camelCase. C'est-à-dire que le premier mot est en minuscule, mais chaque nouveau mot commence par une majuscule.

L'écriture du code PHP est assez bien normée. Vous pouvez retrouver l'ensemble des règles en suivant les PHP Standard Recommendations. Entre autres les PSR-1 et PSR-12.

  • Ensuite une paire de parenthèses qui nous permettront par la suite d'y réclamer des arguments, de la même manière qu'une fonction.

  • Juste après les parenthèses se trouve la déclaration du typefloat du résultat de la méthode. C’est optionnel mais c’est une excellente pratique.

  • Enfin entre accolades, les instructions de la méthode.

Au sein de la méthode getSurface(), nous retournons le résultat du calcul effectué auparavant. Vous constaterez l’utilisation de$this à la place de $pont, nous y reviendrons juste après cette partie.

Appelons maintenant cette méthode pour obtenir la surface : 

// …

$pont = new Pont;
$pont->longueur = 286.0;
$pont->largeur = 15.0;

$surface = $pont->getSurface();

var_dump($surface);

Tester ce code

Cela commence de la même manière que l'accès à une propriété :

  • le nom de la variable contenant l'instance, 

  • suivi d'une flèche-> ainsi que le nom de la méthode, 

  • suffixé d'une paire de parenthèses vide. 

C'est cette paire de parenthèses qui indique à PHP qu'il ne doit pas tenter de renvoyer la valeur d'une propriété, mais le résultat de l'exécution d'une méthode. Vous pouvez tout à fait avoir une méthode et une propriété du même nom, même si ce n’est pas recommandé.

Plus besoin de chercher où se trouve votre fonction, vous savez qu'elle accompagnera votre objet. D’ailleurs, souvent, votre IDE saura vous proposer par auto-complétion les méthodes disponibles dans votre objet. C’est pratique n'est-ce pas ? :)

Nous verrons ensuite que faire ainsi va simplifier le travail lorsque les noms de nos méthodes à travers l'ensemble des classes d'un projet sont homogène.

Manipulez vos propriétés et vos méthodes depuis votre objet

Il est maintenant temps de vous expliquer les secrets de $this, que vous avez remarqué dans le code précédent. Regardons tout d’abord de plus près cette formule :

$surface = $pont->longueur * $pont->largeur;

$pont fait référence à l'instance de notre classe. Lorsque vous déclarez une méthode dans votre classe, vous ne pouvez pas avoir connaissance des instances futures.

peu importe le pont créé, getSurface() doit renvoyer la surface du pont en question, à partir de sa propre largeur et de sa propre longueur
Manipulation depuis l'objet

Dans notre exemple, peu importe le pont créé, getSurface() doit renvoyer la surface du pont en question, à partir de sa propre largeur et de sa propre longueur. Nous n’aurons pas les mêmes tailles pour tous les ponts. Pour cela, on utilise le mot clé$this:

<?php

declare(strict_types=1);

class Pont
{
   public float $longueur;
   public float $largeur;
  
   public function getSurface(): float
   {
       return $this->longueur * $this->largeur;
   }
}

$towerBridge = new Pont;
$towerBridge->longueur = 286.0;
$towerBridge->largeur = 15.0;

$manhattanBridge = new Pont;
$manhattanBridge->longueur = 2089.0;
$manhattanBridge->largeur = 36.6;

$towerBridgeSurface = $towerBridge->getSurface();
$manhattanBridgeSurface = $manhattanBridge->getSurface();

var_dump($towerBridgeSurface);
var_dump($manhattanBridgeSurface);

Tester ce code

Dans cet exemple, nous avons 2 instances de pont, chacune avec ses dimensions. L'usage de $this nous permet de faire références aux valeurs portées par chacune des instances.

Exercez-vous

Maintenant que nous avons vu comment créer une classe et définir la visibilité des propriétés et des méthodes, il est temps de vous exercer !

Vous vous souvenez de notre cas fil rouge, Matchmaker ? Voici ce qu’on va faire. Je vais commencer par vous donner un squelette de code simple, écrit de manière fonctionnelle qui pourrait être le système de classement. Au fur et à mesure des exercices de ce cours, nous transformerons notre code avec les notions apprises au cours du chapitre. Pour arriver à un code que vous pourriez exploiter tel quel, ou dans n’importe quel framework PHP. :)

Vous trouverez notre code jusqu’ici sur la branche P1C4 et la correction sur la branche P1C4-correction

Votre mission, si vous l’acceptez, est de :

  • Créer les classesEncounter

  • Remplacer les fonctions fournies dans le code par des méthodes de classe

Vous trouverez les corrigés sous les instructions.  A vous de coder !

‌En résumé

  • Les objets possèdent des propriétés et des méthodes

  • Pour désigner une instance, nous utilisons le mot clé$this, permettant de faire appel aux propriétés ou méthodes de notre objet au sein d’une autre méthode.

Quand vous découvrez une classe la première fois, vous avez 2 moyens de connaître son mode de fonctionnement. Lire la documentation et lire le code. Mais dans la vraie vie, la documentation n’est pas toujours au top du top. Le code devrait être une doc à lui seul ! Voyons comment rendre une classe simple à utiliser dans le chapitre suivant. :D 

Example of certificate of achievement
Example of certificate of achievement