Résolution des conflits entre traits
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 53 sur 91.
Lorsque deux traits définissent des méthodes portant le même nom, PHP génère une erreur fatale. Vous devez indiquer explicitement à PHP comment gérer ce conflit à l’aide des opérateurs insteadof et as.
<?php
trait FileLogger {
public function log(string $message): void {
echo "File: $message";
}
}
trait DatabaseLogger {
public function log(string $message): void {
echo "DB: $message";
}
}
class Application {
use FileLogger, DatabaseLogger {
FileLogger::log insteadof DatabaseLogger;
DatabaseLogger::log as logToDatabase;
}
}
$app = new Application();
$app->log("Error occurred");
$app->logToDatabase("Error occurred");
Sortie :
File: Error occurred
DB: Error occurredL’opérateur insteadof choisit la méthode du trait à utiliser en cas de conflit. Dans cet exemple, FileLogger::log l’emporte et devient la méthode log() par défaut. L’opérateur as crée un alias, ce qui vous permet d’accéder à la méthode de l’autre trait sous un nom différent.
Vous pouvez également utiliser as pour modifier la visibilité d’une méthode :
<?php
trait Greeting {
public function sayHello(): void {
echo "Hello!";
}
}
class Person {
use Greeting {
sayHello as private;
}
}
Cela rend sayHello() privée au sein de la classe Person, même si elle est publique dans le trait. La résolution des conflits vous permet de contrôler avec précision la manière dont les méthodes des traits s’intègrent à vos classes.
Défi
FacileConstruisons un système de notifications dans lequel différents canaux peuvent envoyer des messages, mais nous devons résoudre les conflits lorsque plusieurs traits fournissent le même nom de méthode.
Tu organiseras ton code sur quatre fichiers :
EmailNotifier.php: crée un trait appeléEmailNotifieravec une méthodenotify(string $message)qui renvoie"Email: [message]".SmsNotifier.php: crée un trait appeléSmsNotifieravec une méthodenotify(string $message)qui renvoie"SMS: [message]".AlertService.php: crée une classeAlertServicequi utilise les deux traits. Comme les deux traits possèdent une méthodenotify(), tu devras résoudre ce conflit :- Utilise
EmailNotifier::notifycomme méthodenotify()par défaut - Crée un alias
notifyBySmspour la méthodeSmsNotifier::notify
notifyAll(string $message)qui appelle les deux méthodes de notification et les renvoie combinées sur des lignes séparées.- Utilise
main.php: inclus tous les fichiers nécessaires et crée une instance deAlertService. Tu recevras une entrée : une chaîne de message. Affiche trois lignes :- Le résultat de l'appel de
notify()avec le message - Le résultat de l'appel de
notifyBySms()avec le message - Le résultat de l'appel de
notifyAll()avec le message
- Le résultat de l'appel de
Cela montre comment insteadof détermine la méthode du trait qui l'emporte en cas de conflit de noms, tandis que as te permet de conserver l'accès à la méthode de l'autre trait sous un nom différent.
Essayez vous-même
<?php
require_once 'AlertService.php';
// Lire l'entrée
$message = trim(fgets(STDIN));
// TODO: Créer une instance d'AlertService
// TODO: Afficher le résultat de l'appel à notify() avec le message
// TODO: Afficher le résultat de l'appel à notifyBySms() avec le message
// TODO: Afficher le résultat de l'appel à notifyAll() avec le message
?>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