Menu
Coddy logo textTech

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 occurred

L’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.

challenge icon

Défi

Facile

Construisons 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é EmailNotifier avec une méthode notify(string $message) qui renvoie "Email: [message]".
  • SmsNotifier.php : crée un trait appelé SmsNotifier avec une méthode notify(string $message) qui renvoie "SMS: [message]".
  • AlertService.php : crée une classe AlertService qui utilise les deux traits. Comme les deux traits possèdent une méthode notify(), tu devras résoudre ce conflit :
    • Utilise EmailNotifier::notify comme méthode notify() par défaut
    • Crée un alias notifyBySms pour la méthode SmsNotifier::notify
    Ajoute également une méthode notifyAll(string $message) qui appelle les deux méthodes de notification et les renvoie combinées sur des lignes séparées.
  • main.php : inclus tous les fichiers nécessaires et crée une instance de AlertService. 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

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