Menu
Coddy logo textTech

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, définissant des méthodes que les classes enfants doivent implémenter. Vous créez une classe abstraite en utilisant le 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 :

15

La classe Shape déclare une méthode abstraite calculateArea() sans fournir d'implémentation. Toute classe étendant Shape doit implémenter cette méthode. Notez que les classes abstraites peuvent également contenir des méthodes régulières comme getColor() dont 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 ont une méthode calculateArea() tout en laissant chaque forme calculer son aire différemment.

Point clé : Les classes abstraites combinent la structure de l'héritage avec des exigences imposées. Utilisez-les lorsque vous souhaitez partager du code entre des classes apparentées tout en garantissant que certaines méthodes sont implémentées par chaque classe enfant.

challenge icon

Défi

Facile

Construisons un système de lecteur multimédia qui dé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 sur trois fichiers :

  • Media.php — Définissez une classe abstraite Media qui sert de modèle pour tous les types de médias. Elle doit avoir une propriété protégée $title et un constructeur qui accepte et définit le titre. Incluez une méthode abstraite appelée play() que les classes enfants doivent implémenter. Ajoutez également une méthode régulière getTitle() qui retourne le titre — cette méthode concrète sera héritée par toutes les classes enfants.
  • Song.php — Définissez une classe Song qui étend Media. Incluez le fichier Media en haut. Cette classe ajoute une propriété $artist. Le constructeur doit accepter le titre et l'artiste — utilisez parent::__construct() pour le titre, puis définissez l'artiste vous-même. Implémentez la méthode play() requise pour retourner "Playing song: [title] by [artist]".
  • Podcast.php — Définissez une classe Podcast qui étend Media. Incluez le fichier Media en haut. Cette classe ajoute une propriété $episode (un entier). Le constructeur doit accepter le titre et le numéro d'épisode — utilisez parent::__construct() pour le titre, puis définissez l'épisode. Implémentez la méthode play() requise pour retourner "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 d'épisode (sous forme de chaîne à convertir en entier). Créez un objet Song et un objet Podcast avec ces valeurs. Affichez le résultat de l'appel à play() sur la chanson en premier, puis 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 avoir une méthode play(), mais chaque type l'implémente différemment. La classe abstraite Media ne peut pas être instanciée directement ; elle n'existe que pour fournir une structure et des fonctionnalités partagées à ses enfants.

Aide-mémoire

Une classe abstraite est une classe qui ne peut pas être instanciée directement. Elle sert de modèle pour d'autres classes, définissant des méthodes que les classes enfants doivent implémenter. Utilisez le mot-clé abstract pour créer une classe abstraite.

abstract class Shape {
    protected $color;
    
    public function __construct($color) {
        $this->color = $color;
    }
    
    abstract public function calculateArea();
    
    public function getColor() {
        return $this->color;
    }
}

Les classes enfants doivent implémenter toutes les méthodes abstraites :

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;
    }
}

Caractéristiques clés :

  • Les classes abstraites ne peuvent pas être instanciées directement
  • Les méthodes abstraites n'ont pas d'implémentation dans la classe abstraite
  • Les classes enfants doivent implémenter toutes les méthodes abstraites
  • Les classes abstraites peuvent contenir à la fois des méthodes abstraites et des méthodes régulières
  • Les méthodes régulières dans les classes abstraites sont héritées par les 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 la chanson

// TODO: Afficher le résultat de l'appel à play() sur le podcast

?>
quiz iconTestez-vous

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