Easy-Micro

LANGAGE Intro POO PHP
Classes abstraites

Introduction à la programmation orientée objet en PHP

Classes et méthodes abstraites

Une classe abstraite est une classe qui ne va pas pouvoir être instanciée directement, c'est-à-dire qu'on ne va pas pouvoir manipuler directement.

On ne pourras plus faire de $Utilisateur1 = new Utilisateur('Papy56', 123, 'Nord');

Une méthode abstraite est une méthode dont seule la signature (c'est-à-dire le nom et les paramètres) va pouvoir être déclarée mais pour laquelle on ne va pas pouvoir déclarer d'implémentation (c'est-à-dire le code dans la fonction ou ce que fait la fonction).

L'idée est d'obliger les autres développeurs à étendre nos classes sans toucher à la classe mère. En effet, en créant un plan "protégé" (puisqu'une classe abstraite ne peut pas être instanciée directement) on force les développeurs à étendre cette classe et on les force également à définir les méthodes abstraites.

Le fichier classes/utilisateur.class.php
<?php
// la classe Utilisateur devient abstraite

abstract class Utilisateur {
     protected $user_name;
     protected $user_region;
     protected $prix_abo;
     protected $user_pass;
     public const ABONNEMENT = 15;

     // On supprime le constructeur qui va être défini dans les classes étendues
        
     public function __destruct(){
         //Du code à exécuter
     }
        
     // En définissant setPrixAbo() comme abstraite, 
     // on force les classes étendues à l'implémenter

     abstract public function setPrixAbo();
        
     public function getNom(){
         echo $this->user_name;
     }

     public function getPrixAbo(){
         echo $this->prix_abo.' &euro;';
     }
}
On va donc transformer notre classe Utilisateur afin qu'elle ne définisse que les choses communes à tous les utilisateurs et allons définir les spécificités de chaque type d'utilisateur dans des classes étendues Admin et Abonne.

Dès qu'une classe possède une méthode abstraite, il va falloir la déclarer comme classes abstraite avec le mot clef abstract.

Les seules différences entre les classes abstraites et classiques est qu'une classe abstraite peut contenir des méthodes abstraites et doit obligatoirement être étendue pour utiliser ses fonctionnalités.

Maintenant qu'on a défini notre classe Utilisateur comme abstraite, il va falloir l'étendre et également implémenter les méthodes abstraites.

Le fichier classes/admin.class.php
<?php
class Admin extends Utilisateur {
     protected static $ban;
     // on supprime la constante ABONNEMENT puisque nous
     // allons désormais utiliser celle de la classe abstraite
        
     public function __construct($n, $p, $r) {
         $this->user_name = strtoupper($n);
         $this->user_pass = $p;
         $this->user_region = $r;
     }
        
     public function setBan(...$b) {
         foreach($b as $banned){
             self::$ban[] .= $banned;
         }
     }
     public function getBan() {
         echo 'Utilisateurs bannis : ';
         foreach(self::$ban as $valeur) {
            echo $valeur .', ';
         }
     }
        
     // la méthode setPrixAbo() est modifiée
     public function setPrixAbo() {
         if($this->user_region === 'Sud'){
             return $this->prix_abo = parent::ABONNEMENT / 6;
         }else{
             return $this->prix_abo = parent::ABONNEMENT / 3;
         }
     }
}

On va ensuite créer un nouveau fichier de classe qu'on va appeler abonne.class.php.
Dans ce fichier, nous allons définir un constructeur pour nos abonnés qui représentent nos utilisateurs de base et allons à nouveau implémenter la méthode setPrixAbo().

Le fichier classes/abonne.class.php
<?php
class Abonne extends Utilisateur {
     public function __construct($n, $p, $r) {
         $this->user_name = $n;
         $this->user_pass = $p;
         $this->user_region = $r;
     }
        
     public function setPrixAbo(){
         if($this->user_region === 'Sud') {
             return $this->prix_abo = parent::ABONNEMENT / 2;
         } else {
             return $this->prix_abo = parent::ABONNEMENT;
         }
     }
}
Le fichier index.php
<!DOCTYPE html>
<html  lang="fr">
<head>
<title>POO PHP</title>
<meta charset="utf-8">
<link rel="stylesheet" href="css/mesStyles.css">
</head>
<body>
<h1>Inscription</h1>
<?php
     require 'classes/utilisateur.class.php';
     require 'classes/admin.class.php';
     require 'classes/abonne.class.php';

     $Admin1 = new Admin('Pierre', 'abcdef', 'Sud');
     $Admin2 = new Admin('Mathilde', 123456, 'Nord');
     $Abonne1 = new Abonne('Edouard', 123456, 'Est');
        
     $Admin1 -> setPrixAbo();
     $Admin2 -> setPrixAbo();
     $Abonne1 -> setPrixAbo();

     echo 'Prix de l\'abonnement pour ';
     $Admin1 -> getNom();
     echo ' : ';
     $Admin1 -> getPrixAbo();

     echo '<br>Prix de l\'abonnement pour ';
     $Admin2 -> getNom();
     echo ' : ';
     $Admin2 -> getPrixAbo();

     echo '<br>Prix de l\'abonnement pour ';
     $Abonne1 -> getNom();
     echo ' : ';
     $Abonne1 -> getPrixAbo();
?>
</body>
</html>

-> Voir cet exemple Easy-Micro

« Prev - Intro POO PHP - Next »


< Page précédente INTRO POO PHP Page suivante >