Menu
Coddy logo textTech

Classes anonymes

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 58 sur 91.

Parfois, vous avez besoin d’un objet simple et ponctuel sans la surcharge liée à la définition d’une classe complète. Les classes anonymes vous permettent de créer des objets à la volée, exactement là où vous en avez besoin. Elles sont particulièrement utiles lorsqu’elles sont combinées à l’injection de dépendances.

Une classe anonyme est définie à l’aide de new class, suivi du corps de la classe :

<?php
$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("Hello!");

Sortie :

Log: Hello!

Les classes anonymes deviennent puissantes lors de l’implémentation d’interfaces. C’est idéal pour les tests ou lorsque vous avez besoin d’une implémentation rapide sans encombrer votre base de code avec des classes à usage unique :

<?php
interface Notifier {
    public function send(string $message): string;
}

function notify(Notifier $notifier, string $msg): string {
    return $notifier->send($msg);
}

$result = notify(new class implements Notifier {
    public function send(string $message): string {
        return "Sent: $message";
    }
}, "Test message");

echo $result;

Sortie :

Sent: Test message

Les classes anonymes peuvent également étendre d’autres classes, utiliser des traits et accepter des arguments de constructeur. Elles ont un accès complet aux fonctionnalités de la POO : elles sont simplement définies en ligne plutôt que dans un fichier séparé. Utilisez-les lorsqu’une définition complète de classe serait excessive, mais que vous avez tout de même besoin d’un comportement orienté objet.

challenge icon

Défi

Facile

Construisons un système de formatage de données qui démontre la puissance des classes anonymes. Au lieu de créer des fichiers de classe distincts pour des implémentations simples et ponctuelles, vous utiliserez des classes anonymes pour créer rapidement des implémentations directement là où vous en avez besoin.

Vous organiserez votre code sur deux fichiers :

  • FormatterInterface.php : définissez une interface appelée FormatterInterface avec une seule méthode format(string $data): string. Cela établit le contrat que tout formateur doit respecter.
  • main.php : incluez le fichier d’interface et créez une classe DataProcessor qui utilise l’injection de dépendances pour accepter n’importe quel formateur. La classe doit :
    • accepter une FormatterInterface dans son constructeur
    • posséder une méthode process(string $data) qui délègue le traitement au formateur injecté et renvoie son résultat

    Vous recevrez deux entrées : un type de format ("upper" ou "reverse") et une chaîne à formater.

    En fonction du type de format, créez une classe anonyme qui implémente FormatterInterface :

    • Pour "upper" : la méthode format() doit renvoyer les données converties en majuscules
    • Pour "reverse" : la méthode format() doit renvoyer les données inversées

    Injectez votre classe anonyme dans un DataProcessor, appelez process() avec la chaîne d’entrée et affichez le résultat.

Cette approche est parfaite lorsque vous avez besoin d’une implémentation rapide sans encombrer votre base de code avec des fichiers de classe à usage unique. La classe anonyme est créée directement dans le code, implémente l’interface requise et peut être transmise partout où cette interface est attendue.

Essayez vous-même

<?php
require_once 'FormatterInterface.php';

// TODO : Créez une classe DataProcessor qui :
// - Accepte une FormatterInterface dans son constructeur
// - Possède une méthode process(string $data) qui délègue au formatter

// Lire l'entrée
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));

// TODO: Based on $formatType ("upper" or "reverse"), create an anonymous class
// qui implémente FormatterInterface
// - Pour "upper" : format() doit renvoyer la version en majuscules des données
// - Pour "reverse" : format() doit renvoyer la version inversée des données

// TODO: Create a DataProcessor with your anonymous class formatter
// Appelez process() avec la chaîne d'entrée et affichez le résultat

?>
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

Entraînez-vous par vous-même : Compilateur PHP en ligne