Programmation orientée objet (POO) en PHP

Auteur: Mohamed CHINY Durée necessaire pour le cours de Programmation orientée objet (POO) en PHP Niveau recommandé pour le cours de Programmation orientée objet (POO) en PHP Supports vidéo disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz non disponibles pour ce cours

Page 2: La POO en PHP (Programmation Orientée Objet)

Toutes les pages

POO en PHP - Notions de classe, objet et instanciation

Qu'est ce qu'un objet?

La programmation orientée objet est plus naturelle donc plus intuitive. Si c'est le cas, c'est parce qu’elle utilise des entités appelées objets. Un objet possède sa propre structure interne qui définit ses propriétés et son comportement. Si on compare avec le monde réel, les objets sont partout autour de nous. Une personne est un objet, une voiture en est un autre, une maison, une école, un animal de compagnie... tous sont des objets.

Prenons l'objet "voiture". Bien qu'il en existe plusieurs modèles, le fait d'évoquer le mot "voiture" fait penser à des points comme:
  • couleur
  • options
  • puissance du moteur
  • vitesse
  • source d'énergie
  • ...

Ces points représentent les caractéristiques (ou propriétés) de l'objet voiture. Dans le jargon de la POO, on les appelle des attributs.

Cependant, une voiture peut aussi entamer des actions, par exemple:
  • Accélérer
  • Ralentir
  • Tourner à droite
  • Tourner à gauche
  • Reculer
  • ...

Vous avez sans doute remarqué que j'ai utilisé des verbes pour spécifier les actions que peut entreprendre une voiture. L'ensemble de ces actions constitue le comportement de celle-ci. En POO on les appelles des méthodes.

Une classe c'est quoi?

Les objets de la POO doivent être créés d'abord pour pouvoir être manipulés après. C'est la classe qui se charge de donner vie aux objets.

Une classe est une structure cohérente de propriétés (attributs) et de comportements (méthodes). C'est elle qui contient la définition des objets qui vont être créés après. En général on considère une classe comme un moule à objets. Avec un seul moule on peut créer autant d'objets que l'on souhaite.

Techniquement parlant, une classe est une structure qui contient des attributs (appelés aussi variables membres) et des méthodes (connus également par fonctions membres). Les méthodes agissent sur les attributs de cette structure. Par exemple, le fait d’accélérer augmente la vitesse de la voiture.

L'instanciation d'une classe

L'instanciation est le fait de créer une instance. Pour être précis, on parle d'une instance de classe. La classe étant le moule qui sert à fabriquer les objets, alors chaque objet créé correspond à une instance de la classe qui lui a donné vie.

Créer une classe

Déclaration de la classe

La classe renferme l'ensemble des propriétés et de méthodes qui servent à définir l'identité de l'objet qui en découlera (l'instance de classe).

Supposons que l'on souhaite créer une classe "voiture". Celle ci aura certaines propriétés (attributs) comme: couleur, puissance et vitesse. Elle aura aussi des méthodes comme accélérer et ralentir. Notre classe "voiture" renfermera tous ces éléments (membres).

Pour créer la classe "voiture" on écrira le code suivant:
<?php
   class Voiture{
      // Déclaration des membres
   }
?>
le mot clé class sert à indiquer que l'on veut créer une classe. Il est suivi du nom de celle ci, Voiture dans ce cas, suivi de deux accolades (ouvrante et fermante) qui contiendront la déclaration des éléments membres (attributs et méthodes).
Vous avez remarqué que le nom de la classe commence par une majuscule. En fait, il est pour coutume de capitaliser les noms des classes en PHP. Cependant, si vous ne faites pas de même, la classe fonctionnera aussi.

Déclaration des attributs - Principe d'encapsulation

Les attributs sont les variables membres de la classe. Ils constituent les propriétés ou les caractéristiques de l'objet (l'instance de classe) qui en sera né.

Pour déclarer un attribut il faut le précéder par sa visibilité. La visibilité d'un attribut indique à partir d'où on peut y avoir accès. Il existe trois types de visibilité:
  • public: dans ce cas, l'attribut est accessible de partout (de l'intérieur de la classe dont il est membre comme de l'extérieur).
  • private: dans ce cas, l'attribut est accessible seulement de l'intérieur de la classe dont il est membre.
  • protected: dans ce cas, l'attribut est accessible seulement de l'intérieur de la classe dont il est membre ainsi que de l'intérieur des classes fille qui héritent de cette classe (Nous verrons l'héritage plus loin dans ce cous).

Cependant, c'est la visibilité private (ou protected qui est considérée comme extension de private) qui est recommandée. On parle alors du principe d'encapsulation.

Principe d'encapsulation:

L'encapsulation est un principe fondamental de la POO. Il vise à masquer les attributs aux utilisateurs du code (les programmeurs qui se serviront de la classe par la suite). En fait, ce qui est important dans une classe ce sont les attributs. Les méthodes ne font qu'agir sur ceux ci. Le fait d'exposer les attributs aux utilisateur peut compromettre le bon fonctionnement de la classe. Il faut donc les masquer et leur limiter l'accès uniquement de l'intérieur de la classe par le biais des méthodes prévues à cet effet.

Pour mieux comprendre comment la manipulation directe des attributs peut compromettre le bon fonctionnement de la classe, il n'y a pas mieux qu'un exemple.

Imaginons que nous conduisons une voiture et que nous voulons accélérer pour atteindre une vitesse élevée. On sait que tout est question de mécanique sous le capot. Il suffirait alors d'actionner quelques engrenages et quelques courroies pour augmenter la vitesse. Cependant, il est inconcevable de faire cela en manipulant les pièces mécaniques directement, d'abord parce que c'est dangereux, et aussi parce qu'on peut abîmer la mécanique de la voiture en procédant à des fausses manœuvres. Or, l'habitacle de la voiture est déjà équipé de pédales qui permettent d’accélérer ou ralentir sans danger et sans même être connaisseur en mécanique.

Dans cet exemple, on peut assimiler les pièces mécaniques sous le capot aux attributs et les pédales aux méthodes.

Définissons maintenant les attributs de la classe "Voiture":
<?php
   class Voiture{
      private $couleur="Rouge";
      private $puissance=130;
      private $vitesse=0;
   }
?>
Vous avez remarqué que les attributs sont des variables PHP. Or, ce ne sont pas des variables classiques car pour les manipuler il faut passer par l'instance de classe (ou parfois, par la classe elle même).

Dans cet exemple nous avons déclaré les attributs en les initialisant. Cependant, c'est une pratique peu courante, car l'initialisation des attributs est prévue ailleurs (on verra ça plus loin).

Le code précédent peut donc être écrit simplement comme ceci:
<?php
   class Voiture{
      private $couleur;
      private $puissance;
      private $vitesse;
   }
?>

Déclaration des méthodes

Les méthodes sont des fonctions membres. Ce sont elles qui se chargent de manipuler les attributs et dotent ainsi la classe de son comportement.

Pour déclarer une méthode il suffit de procéder comme si on déclarait une fonction en PHP en la précédant par la visibilité qui peut être soit public ou private. Une méthode publique est accessible de partout (de l'intérieur comme de l'extérieur de la classe). Une méthode privée est accessible seulement de l'intérieur de la classe. Elle est généralement sollicitée par une autre méthode publique.

Supposons que je veux maintenant ajouter les méthodes accelerer() et ralentir() à la classe Voiture, le code ressemblerait à ceci:
<?php
   class Voiture{
      private $couleur;
      private $puissance;
      private $vitesse;
      public function accelerer(){
         // Corps de la méthode accelerer()
      }
      public function ralentir(){
         // Corps de la méthode ralentir()
      }
   }
?>