Classes abstraites
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 25 sur 91.
Une classe abstraite est une classe qui ne peut pas être instanciée directement. Elle sert de modèle pour d’autres classes, en définissant des méthodes que les classes enfants doivent implémenter. Vous créez une classe abstraite à l’aide du mot-clé abstract.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
Sortie :
15La classe Shape déclare une méthode abstraite calculateArea() sans fournir d’implémentation. Toute classe qui étend Shape doit implémenter cette méthode. Notez que les classes abstraites peuvent également contenir des méthodes ordinaires comme getColor(), que les classes enfants héritent directement.
Les méthodes abstraites définissent ce qu’une classe enfant doit faire, mais pas comment. Cela garantit que toutes les formes possèdent une méthode calculateArea(), tout en permettant à chaque forme de calculer son aire différemment.
Point clé : Les classes abstraites combinent la structure de l’héritage avec des exigences obligatoires. Utilisez-les lorsque vous souhaitez partager du code entre des classes apparentées tout en vous assurant que certaines méthodes sont implémentées par chaque classe enfant.
Défi
FacileConstruisons un système de lecteur multimédia qui montre comment les classes abstraites imposent un contrat tout en permettant à différents types de médias d’implémenter leur propre comportement de lecture.
Vous organiserez votre code dans trois fichiers :
Media.php: définissez une classe abstraiteMediaqui sert de modèle à tous les types de médias. Elle doit posséder une propriété$titleprotégée et un constructeur qui accepte et définit le titre. Incluez une méthode abstraite appeléeplay()que les classes enfants doivent implémenter. Ajoutez également une méthode ordinairegetTitle()qui renvoie le titre. Cette méthode concrète sera héritée par toutes les classes enfants.Song.php: définissez une classeSongqui étendMedia. Incluez le fichier Media au début. Cette classe ajoute une propriété$artist. Le constructeur doit accepter le titre et l’artiste : utilisezparent::__construct()pour le titre, puis définissez vous-même l’artiste. Implémentez la méthodeplay()requise afin qu’elle renvoie"Playing song: [title] by [artist]".Podcast.php: définissez une classePodcastqui étendMedia. Incluez le fichier Media au début. Cette classe ajoute une propriété$episode(un entier). Le constructeur doit accepter le titre et le numéro de l’épisode : utilisezparent::__construct()pour le titre, puis définissez l’épisode. Implémentez la méthodeplay()requise afin qu’elle renvoie"Playing podcast: [title] - Episode [episode]".
Dans main.php, incluez les fichiers Song et Podcast. Vous recevrez quatre entrées : le titre de la chanson, le nom de l’artiste, le titre du podcast et le numéro de l’épisode (sous forme de chaîne à convertir en entier). Créez un objet Song et un objet Podcast avec ces valeurs. Affichez d’abord le résultat de l’appel à play() sur la chanson, puis celui de l’appel sur le podcast, chacun sur sa propre ligne.
Ce défi montre comment les classes abstraites définissent un contrat : chaque type de média doit disposer d’une méthode play(), mais chaque type l’implémente différemment. La classe abstraite Media ne peut pas être instanciée directement ; elle existe uniquement pour fournir une structure et des fonctionnalités communes à ses classes enfants.
Essayez vous-même
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// Lire les entrées
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// TODO: Créer un objet Song avec songTitle et artistName
// TODO: Créer un objet Podcast avec podcastTitle et episodeNumber
// TODO: Afficher le résultat de l'appel à play() sur le song
// TODO: Afficher le résultat de l'appel à play() sur le podcast
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne