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.' €';
}
}
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().
<?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;
}
}
}