Passer d'un script procédural à un script POO
#1 Objectif du tuto
Je vais reprendre le TD numéro 5 que j'ai fait en procédural et je vais le passer en POO. Ca va me permettre de mettre en évidence essentiellement l'intérêt de l'encapsulation et de l'injection de dépendance 😃. Le TD numéro 5 est un outil pour entraîner la mémoire.
C'est un outil qui vous pose une question. Vous devez essayer de trouver une réponse et la garder en tête. Puis, vous demandez l'affichage de la réponse pour vérifier.
Demo ICICet outil est composé :
- D'un fichier
data.php
qui gère les données qui se trouvent dans un fichier. Ce fichier se nommedata.txt
. Vous avez un exemple ci-dessous. Chaque ligne du fichier contient un couple question/réponse. La question et la réponse sont séparées par une virgule. - D'un fichier
afficher.php
qui gère les affichages. - D'un script principal
memo.php
qui fait unrequire
des deux fichiers précédents.
Je résume ci-dessous le fonctionnement de memo.php
.
- On charge les données sous la forme d'un tableau qui contient des couples de questions et réponses. Chaque couple a un numéro dans un tableau à deux dimensions.
- S'il n'y a pas la superglobale
$_GET['numero']
d'injectée dans le script alors :- On va tirer au sort un numéro de couple question/réponse.
- On va afficher la question. C'est là que vous devez chercher dans votre tête si vous avez la réponse.
- On prépare un champ caché, qui contient le numéro de ce couple. L'appui sur le bouton
Afficher Réponse
relance le scriptmemo.php
mais cette fois avec$_GET['numero']
qui est affectée avec le numéro du couple question/réponse.
- S'il y a la superglobale
$_GET['numero']
d'injectée dans le script alors :- On affiche la question et sa réponse.
- Et c'est là que vous pouvez vérifier si vous aviez la bonne réponse.
#2 On passe l'exemple ci-dessus de procédural à POO ?
- Comme je l'ai dit dans le tuto La POO pour quoi faire ?, procédural ou POO, l'analyse fonctionnelle ne change pas. Bien sûr, il va y avoir des différences de conception. Mais souvent, on retrouve grosso modo la même modularité.
- Dans un premier temps, ce que l'on va faire, c'est mettre des classes en place dans les fichiers
data.php
etafficher.php
. Ensuite, on construira les objets dans le script principal. - On va s'occuper en premier du fichier
data.php
, que l'on va renommer enData.php
, car il contient une classe. Ce que je veux, c'est encapsuler la variable$fd
et faire en sorte qu'elle ne remonte pas dans le script principal 😃. Le script principal se fiche de l'endroit où l'on va chercher les données. Il ne veut rien connaître de cette complexité. Il veut faire ungetQR()
et récupérer ses données. C'est tout !
- A présent, on s'occupe du fichier
Afficher.php
. Dans ce fichier, on va se contenter de mettre une classe en place. - Je déclare les méthodes en
public
. Si je ne mets rien, PHP déclare par défaut les méthodes enpublic
, mais c'est mieux de le mettre.
- Maintenant, je reprends le script principal. Il va falloir que je construise les objets.
- Il faut se souvenir que le
new Data()
va déclencher l'appel du__construct()
. C'est à ce moment-là que l'on va initialiser la "couche logicielle"Data.php
. Remarquez bien que, maintenant, l'initialisation est locale à la classe et encapsulée dans la classe. Cette initialisation va se faire au moment de la création de l'objet$data
dans le script principal 😃.
#3 On injecte une dépendance
A présent, je veux simplifier mon script principal. Le tableau $qr
qui contient des données apparait plusieurs fois dans le script principal. Je voudrais cacher ces données. C'est la classe Afficher
qui en a besoin. Je vais donc injecter un objet de la classe Data
dans le constructeur de la classe Afficher
. C'est ce que l'on appelle injecter une dépendance 😃.
Je vais supprimer le $qr = $data->getQR();
(* ligne 27 ci-dessus) et le faire descendre dans la classe Afficher
.
Il faudra de ce fait retoucher tous les endroits où figure la variable $qr
.
Ci-dessous la classe Afficher avec les modifications.
- Vous pouvez constater ci-dessous que toutes les données sont encapsulées dans les objets.
- On a encapsulé la gestion du fichier et de son descripteur
$fd
dansData.php
. - On a encapsulé le tableau de données
$qr
dansAfficher.php
. - Il ne reste dans le script principal
memo.php
que la fonction essentielle de ce script, à savoir : S'il n'y a pas de numéro d'injecté, il le tire au sort et il affiche la question. S'il y a un numéro d'injecté, il affiche la question et la réponse. - L'initialisation des deux "couches logicielles" que constituent les classes se fait localement dans chaque objet au moment de sa construction. Rien ne traîne dans l'application principale pour initialiser quoi que ce soit. C'est important de le voir. Si vous avez déjà fait de grosses applications qui nécessitent la mise en place de beaucoup de ressources, alors, vous devez bien sentir l'avantage que je mets ici en évidence.
- Et tout cela sans avoir mis en place le moindre mécanisme d'héritage !!