Articles et petites annonces

Exercice 6 sur 9 du chapitre 2 · 150 XP · 5 objectifs vérifiés par des tests

Notions abordées : InterfaceimplementsPolymorphisme

Madame Lou a un vieux vélo de factrice à vendre, et elle n'est pas la seule : les petites annonces arrivent à la poste. Une annonce n'est pas un article : ni auteur, ni chapô, mais un prix et un contact. Pourtant, la une doit afficher l'un comme l'autre, sans se demander qui est qui.

Votre mission

  1. Déclarez une interface Publication, avec une seule méthode : versHtml(): string.
  2. Article implémente Publication : le corps d'afficherArticle() devient sa méthode versHtml(), et la fonction disparaît.
  3. Déclarez une classe Annonce qui implémente Publication, avec string $titre, int $prix et string $contact en lecture seule. Sa méthode versHtml() renvoie un <article class="annonce"> avec l'étiquette <p class="rubrique">PETITE ANNONCE</p>, le titre (échappé) dans un <h2>, <p class="prix">40 €</p> et <p class="contact">Contact : …</p>.
  4. Rangez les articles et l'annonce « Vends vélo de factrice, très bon état », 40 €, contact « Madame Lou, à la poste », dans un tableau $publications, et affichez-les par $publication->versHtml().

Rappel

Une interface est un contrat : toute classe qui l'implémente promet d'en avoir les méthodes. La boucle n'a plus besoin de savoir si elle tient un article ou une annonce, il lui suffit de savoir que c'est une Publication. C'est le polymorphisme : un même appel, des comportements différents selon l'objet.

Si un jour il faut quand même savoir à qui on a affaire, instanceof le dit : $publication instanceof Annonce vaut true pour une annonce. Préférez l'interface quand c'est possible : avec elle, une nouvelle sorte de publication s'affiche sans toucher à la boucle.