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
- Déclarez une interface
Publication, avec une seule méthode :versHtml(): string. ArticleimplémentePublication: le corps d'afficherArticle()devient sa méthodeversHtml(), et la fonction disparaît.- Déclarez une classe
Annoncequi implémentePublication, avecstring $titre,int $prixetstring $contacten lecture seule. Sa méthodeversHtml()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>. - 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.