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 messageLes 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.
Défi
FacileConstruisons 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éeFormatterInterfaceavec une seule méthodeformat(string $data): string. Cela établit le contrat que tout formateur doit respecter.main.php: incluez le fichier d’interface et créez une classeDataProcessorqui utilise l’injection de dépendances pour accepter n’importe quel formateur. La classe doit :- accepter une
FormatterInterfacedans 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éthodeformat()doit renvoyer les données converties en majuscules - Pour
"reverse": la méthodeformat()doit renvoyer les données inversées
Injectez votre classe anonyme dans un
DataProcessor, appelezprocess()avec la chaîne d’entrée et affichez le résultat.- accepter une
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
?>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