La POO, c’est quoi?
La POO est une approche de programmation différente de la méthode classique dite procédurale. Le concept d’objet en programmation est fait pour être naturel et ressembler à ce que manipule un non-informaticien. Un objet est une chose quelconque : une voiture, mon compte en banque. Le principe est de manipuler les données sous forme d’objet comme on le fait dans la vie au quotidien.
La programmation devient plus naturel, plus modulaire, plus facilement réutilisable puisqu’un objet peut servir de base à d’autres types d’objets. Elle dirige le développeur vers une bonne conception du programme. Cette manière de coder implique de comprendre quelques notions fondamentales.
Notion de classe
La programmation objet consiste à créer des entités qui contiennent des variables et des fonctions. Une classe est un modèle de données. La création d’une classe en PHP se fait avec l’opérateur class.
Les variables sont considérées comme des propriétés et les fonctions comme des méthodes. Vous pouvez par exemple créer une classe Voiture qui pourra contenir les caractéristiques (propriétés) d’une voiture sous forme de variables : plaque d’immatriculation, puissance, nombre de portières.. et définir les actions (méthodes) d’une voiture à travers des fonctions comme démarrer, freiner, accélérer…
La classe c’est le moule qui decrit l’objet.
class Voiture{
$plaque;
$puissance;
$nbPortiere;
function demarrer(){
}
function freiner(){
}
}
Créer une instance consiste à créer un objet à partir de ce moule. Si vous changer de moule, tous les objets issus de ce moule seront systématiquement modifiés.
Lorsque que la classe est déclarée (le moule est prêt), vous pouvez l’utiliser pour créer des objets. On dit que la class instancie l’objet
$maVoiture = new Voiture();
Une fois l’objet créé, vous pouvez le manipuler pour lancer des méthodes.
L’encapsulation
Le principe consiste à ‘enfermer’ les caractéristiques de l’objet dans la classe pour les rendre inaccessibles depuis l’extérieur, c’est à dire depuis l’instance (objet créé). Une propriété n’est rien d’autre qu’une variable et son accès permettrait d’en modifier sa valeur. Il n’est pas possible, par exemple, de modifier la valeur de la propriété solde d’un objet compte en banque après l’avoir créer. Le solde d’un compte ne peut être modifier que depuis l’intérieur de la classe.
Pour contrôler ce processus, PHP définit des niveaux d’accéssibilité aux éléments de la classe :
-
- public : propriétés ou méthodes accessibles au niveau de l’objet. Dans la pratique, une propriété n’est jamais déclarée comme publique
- private : propriétés ou méthodes accéssibles seulement au niveau de la classe
- protected : propriétés ou méthodes accessibles au niveau de la classe et au niveau des classes étendues (concept d’héritage)
La classe Voiture vue plus haut pourrait se définir ainsi :
class Voiture{
private $plaque;
private $puissance;
private $nbPortiere;
public function demarrer(){
}
public function freiner(){
}
}
L’héritage
Il s’agit de créer d’autres classes, dites classes filles qui vont hériter des caractéristiques d’une classe parente. Les classes filles vont étendre la classe parente en possédant des fonctionnalités supplémentaires : par exemple, la classe Cadre peut étendre la classe Employe en lui rajoutant la méthode mesResponsabilités()
PHP utilise la syntaxe extends pour procéder à un héritage
class Employe{
private $nom;
private $prenom;
private $salaire;
public function jeTravaille(){
}
}
class Cadre extends Employe{
public function mesResponsabilités(){
}
}
Ce processus d’héritage permet de créer des structures génériques qui serviront de base aux autres entités qui en découleront. De plus il ne sera pas nécessaire de ré-implémenter les propriétés et les méthodes de la classe parente sur les classes dérivées.
Le polymorphisme
Le polymorphisme décrit un modèle dans la programmation orientée objet dans lequel les classes ont des fonctionnalités différentes, tout en partageant une interface commune
La beauté du polymorphisme est que le script qui travaille avec les différentes classes n’a pas besoin de savoir comment elles fonctionnent, car elles sont toutes utilisées de la même façon. Une analogie du monde réel pour le polymorphisme est un bouton. Tout le monde sait comment utiliser un bouton: vous appliquez simplement une pression sur elle. Ce que fait un bouton va dépendre du contexte dans lequel il est utilisé – mais le résultat n’a aucune incidence sur la façon dont il est utilisé. Si votre patron vous dit d’appuyer sur un bouton, vous avez déjà toutes les informations nécessaires pour effectuer la tâche.
Dans le monde de la programmation, le polymorphisme est utilisé pour faire des applications plus modulaire et extensible. Au lieu de déclarations conditionnelles (qui font désordre) pour décrire les différentes actions possible, vous créez des objets interchangeables que vous sélectionnez en fonction de vos besoins. Tel est l’objectif de base du polymorphisme.
L’exemple ci-dessous illustre le polymorphisme. Un sportif ($dany) à la choix entre deux activités : nager ou marcher. Quel que soit l’activité, l’action sera appelée par la même méthode : dans notre cas, bouger(). La méthode ne se soucie pas des détails de chaque activité. En effet chaque activité devient une classe qui définit les données de l’action. Le choix du sport à utiliser sera fait automatiquement à l’exécution par le langage (via un formulaire, par exemple), il suffit de savoir quel objet ($nager) implémentera la méthode.
interface Sport{
public function bouger(Sportif $sportif);
}
class Nager implements Sport {
public function bouger(Sportif $sportif){
return $sportif->getNom().' va nager';
}
}
class Marcher implements Sport {
public function bouger(Sportif $sportif){
return $sportif->getNom().' va marcher';
}
}
class Sportif{
private $nom;
public function __construct($nom){
$this->nom = $nom;
}
public function getNom(){
return $this->nom;
}
public function bouger(Sport $sport){
return $sport->bouger($this);
}
}
$dany = new Sportif("daniel");
$nager = new Nager();
echo $dany->bouger($nager);