Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
POO est l'acronyme de Programmation Orientée Objet.
La programmation orientée objet (POO) peut intimider certains développeurs débutants.
La POO introduit des concepts abstraits comme les classes, les objets, l'encapsulation, l'héritage et le polymorphisme.
Ces notions peuvent sembler complexes pour les programmeurs débutants ou ceux plus expérimentés mais
fidèles à la programmation procédurale.
Cependant, une fois ces concepts maîtrisés, la POO offre de nombreux avantages
tels qu'une meilleure organisation du code, une réutilisabilité accrue et une maintenance facilitée.
Il faut bien faire la distinction entre deux notions : classe et objet.
Une classe est un modèle qui définit les propriétés (attributs) et les comportements (méthodes)
que ses objets auront.
Concrétement il faut d'abord créer une classe puis créer des objets (instances) de cette classe.
Un objet est une instance de classe.
Il possède des valeurs spécifiques pour les propriétés définies dans la classe et peut exécuter les méthodes définies.
L'instanciation consiste à créer des objets à partir d'une classe.
On crée une classe Employes. Le nom d'une classe commence toujours par une lettre majuscule.
À l'intérieur de cette classe on définit les variables et les fonctions de ce modèle. On parle
plus précisément de propriétés et de méthodes.
Dans l'exemple ci-dessus on définit deux propriétés : $nom & $prenom
et une méthode fiche().
Notez que les propriétés et méthodes sont précédées du terme "public". J'aurai pu utiliser le mot "private".
Toute explication sur le sens de ces termes est prématurée ; la réponse sera apportée plus loin.
Étudions attentivement la méthode fiche().
Notez le terme "function". En effet une méthode est une fonction spécifique à une classe.
Que fait cette fonction ?
Elle affiche après un saut de ligne et avec des légendes la valeur des propriétés $nom & $prenom.
Notez la syntaxe $this->nom ; en JS on aurait écrit "this.nom" (notation pointée).
En PHP le point est réservé à la concaténation donc on utilise la notation fléchée.
Maintenant q'une classe est définie, on peut créer des objets à partir de cette classe (on dit aussi créer des instances).
Examinons trois instructions reprises ci-dessous :
$employe1 = new Employes(); $employe1->nom = 'Dutronc'; $employe1->prenom = 'Jeanne';
Je crée une instance de la classe Employes que je nomme $employe1
Cet objet est vide (car il n'y a pas de méthode pour le remplir) mais il a une structure.
Il faut alors affecter des valeurs à ses différentes propriétés.
On retrouve la notation fléchée spécifique à PHP.
Je crée ensuite une deuxième instance de Employes : l'objet $employe2. Puis j'affecte des valeurs aux propriétés.
Nous avons donc deux objets "Employes" (ou deux instances de la classe "Employes").
Nous pouvons maintenant les afficher via la méthode fiche().
$employe1->fiche(); $employe2->fiche();
La description de la classe est un plus complexe mais en contrepartie l'instanciation sera beaucoup plus simple.
Nouveauté par rapport au script précédent est la méthode __construct().
Cette méthode est dite "magique". En ce sens qu'elle est appelée automatiquement
lors de la création d'une instance de classe.
Attention le nom des méthodes magiques n'est pas libre : __construct() & __destruct().
Les deux "underscores" sont obligatoires suivis du mot clé "construct" OU "destruct".
N'oubliez pas de passer des paramètres à la fonction __construct().
Lorsque vous créer une instance de classe, PHP recherche la méthode __construct() dans la définition de cette classe. Une seule instruction suffit alors pour créer l'objet avec ses propriétés.
$employe1 = new Employes("Dutronc","Jeanne");
$employe2 = new Employes("Fermon","Olivier");
...
$employe5 = new Employes("Faure","Olivier");
Donc au prix d'une définition de classe légèrement plus compliquée, l'instanciation est beaucoup plus rapide.
Ça devient tellement simple d'instancier que je ne me gêne pas ; je crée 5 objets.
Une fois n'est pas coutume, commençons par le rendu.
Un superbe affichage mais aussi un messsage d'erreur :
"Fatal error: Uncaught Error: Cannot access private property Voitures::$modele on line 42".
Avant de proposer un "débuggage" du dernier script, je voudrais revenir sur la méthode fiche().
La classe CSS 'centre' centre l'image dans son conteneur avec une largeur de 60%. Ce qui est beaucoup, aussi je corrige en rajoutant la règle en ligne : style ='width : 40%;'
Vous devriez commencer à apprécier la POO. Vous constatez qu'en définissant plusieurs méthodes dans la classe,
on simplifie considérablement la programmation en aval.
Ainsi l'instruction $ma_voiture->fiche() équivaut à de nombreuses lignes de code en programmation procédurale.
La dernière instruction (ligne 42) $ma_voiture->modele = 'R5' génère une erreur.
En lisant le script vous avez noté que les propriétés sont désormais privées ("private"). Donc
on ne ne peut plus y accéder directement.
J'ai pratiqué ce qu'on appelle dans le jargon POO l'encapsulation ; c'est à dire que toutes les propriétés sont privées.
Il s'agit d'un dispositif de sécurité afin qu'on ne puisse pas saisir n'importe quoi dans les objets.
Pour mettre à jour un objet il faut alors passer par une méthode de MAJ ; méthode qui dispose de contrôles de saisie.
Dans ce script je pratique l'encapsulation et en tire les conséquences ...
Je rajoute une méthode publique :
L'injection éventuelle de code HTML malveillant est neutralisée !
Dans la méthode magique __construct() il faudrait aussi intégrer la fonction htmlentities().
Je supprime la dernière instruction et remplace par :
Plus de bug !
Le code d'une classe pouvant être long dans la réalité, il est conseillé de créer un fichier PHP qui contient uniquement
la définition de la classe.
L'usage partagé par les développeurs PHP est de donner l'extension .class.php aux fichiers contenant les définitions de classes.
Il contient la définition de la classe 'Membres'.
Trois propriétés et deux méthodes (dont la méthode magique __construct()).
Il permet de créer et manipuler les membres de l'association.
Notez l'instruction include_once('membres.class.php').
Dans cette association certains membres sont aussi administrateurs.
Outre les trois propriétés (nom, prenom, email) un administrateur se définit aussi par un téléphone et une photo.
Il serait idiot de partir de zéro pour définir la classe Admin. Il suffit de créer une classe Admin à partir de la classe Membres. On dit que la classe Admin hérite de la classe Membres. La classe Admin est la classe fille et Membres, la classe mère.
Inclusion du fichier "membres.class.php" pour récupérer la définition de la classe "Membres".
class Admin extends Membres : la classe Admin hérite de la classe Membres.
Puis je rajoute deux propriétés par rapport aux trois de la classe "Membres".
J'aurai pu construire la méthode __contruct() de la classe "Admin" à partir de celle de la classe "Membres" mais la syntaxe est alors un peu délicate ...
Un bel affichage des administrateurs.
Le polymorphisme en POO permet de traiter des objets de différentes classes de manière uniforme.
Il permet à différentes classes d'implémenter des méthodes portant le même nom mais ayant des comportements spécifiques
selon leur contexte.
Une interface (ou classe abstraite) indique le nom de la méthode identique aux différentes classes qui partagent cette
interface.
interface Surface {public function calcul_surface();} :
Dans chaque classe il y a aura une méthode nommée calcul_surface() ; l'interface entre les
classes se nommme ici Surface.
class Rectangle implements Surface :
la classe "rectangle" partage l'interface "Surface".
class Cercle implements Surface :
la classe "Cercle" partage l'interface "Surface".
Dans chacune des deux classes il y a une méthode nommée calcul_surface().
function affiche_surface(Surface $forme) {echo $forme->calcul_surface();} :
la fonction affiche_surface() gère le polymorphisme. Selon la 'forme' de l'objet cette fonction appelle
la méthode calcul_surface() de la classe "Rectangle" OU la méthode du même nom de la classe "Cercle".
echo affiche_surface($rectangle1) :
appel de la méthode calcul_surface() de la classe "Rectangle puisqu'il s'agit d'une instance de la classe Rectangle.
echo affiche_surface($cercle1) :
appel de la méthode calcul_surface() de la classe "Cercle" puisqu'il s'agit d'une instance de la classe Cercle.