{"id":230076,"date":"2022-11-21T17:34:00","date_gmt":"2022-11-21T14:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230076"},"modified":"2022-11-21T17:42:21","modified_gmt":"2022-11-21T14:42:21","slug":"les-deux-deuxiemes-piliers-de-la-poo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-deuxiemes-piliers-de-la-poo\/","title":{"rendered":"Les deux deuxi\u00e8mes piliers de la POO"},"content":{"rendered":"\n<p>Comme je l&rsquo;ai mentionn\u00e9 dans <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"le premier article de cette s\u00e9rie\">le premier article de cette s\u00e9rie<\/a><\/strong>, vous entendrez souvent parler des trois piliers de la programmation orient\u00e9e objet. Vous pouvez \u00e9galement entendre parler des quatre piliers de la programmation orient\u00e9e objet.<\/p>\n<p>Et ce n&rsquo;est pas qu&rsquo;il y en ait sept au total ou quelque chose comme \u00e7a. Au lieu de cela, il s&rsquo;agit davantage de ce que les gens consid\u00e8rent comme fondamental pour la POO\u00a0: y a-t-il trois ou quatre concepts majeurs\u00a0?<\/p>\n<p>Vous pouvez d\u00e9duire de l&rsquo;article pr\u00e9c\u00e9dent (sans parler du titre), je crois qu&rsquo;il y en a quatre.<\/p>\n<p>Et dans cet article, je vais couvrir les deux derniers\u00a0:<\/p>\n<ul>\n<li>H\u00e9ritage,<\/li>\n<li>et polymorphisme<\/li>\n<\/ul>\n<p>Si vous avez fait n&rsquo;importe quel type de programmation orient\u00e9e objet avant de lire cet article, vous avez probablement entendu parler d&rsquo;au moins l&rsquo;un d&rsquo;entre eux.<\/p>\n<p>Quoi qu&rsquo;il en soit, examinons chacun d&rsquo;eux plus en d\u00e9tail.<\/p>\n<h2>Deux autres piliers de la POO<\/h2>\n<p>Avant de sauter dans chacun d&rsquo;eux, je veux \u00eatre s\u00fbr que vous \u00eates pris dans ce que nous avons couvert jusqu&rsquo;\u00e0 pr\u00e9sent.<\/p>\n<h3>Un mot sur l&rsquo;analyse<\/h3>\n<p>Je n&rsquo;insisterai pas sur ce point, mais la raison pour laquelle je parle maintenant des fondamentaux orient\u00e9s objet est que nous entrons dans une phase diff\u00e9rente de ce mat\u00e9riau. Nous avons commenc\u00e9 par couvrir la phase d&rsquo; <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analyse qui comprenait\u00a0:<\/a><\/strong><\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/programmation-orientee-objet-dans-wordpress-analyse-partie-1\/\" title=\"Analyse, partie 1\">Analyse, partie 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/programmation-orientee-objet-dans-wordpress-analyse-partie-2\/\" title=\"Analyse, partie 2\">Analyse, partie 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/programmation-orientee-objet-dans-wordpress-comprendre-les-attentes-des-clients\/\" title=\"Comprendre les attentes des clients\">Comprendre les attentes des clients<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/programmation-orientee-objet-dans-wordpress-enonce-des-travaux\/\" title=\"\u00c9nonc\u00e9 des travaux\">\u00c9nonc\u00e9 des travaux<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/programmation-orientee-objet-dans-wordpress-termes-et-conditions\/\" title=\"Termes et conditions\">Termes et conditions<\/a><\/li>\n<\/ol>\n<h3>Maintenant au d\u00e9veloppement<\/h3>\n<p>Et maintenant nous entrons dans la phase de <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">d\u00e9veloppement .<\/a><\/strong> Certains peuvent appeler cela les fondamentaux (mais je suis content que vous ne puissiez pas faire un bon d\u00e9veloppement sans les fondamentaux, donc il y a \u00e7a (.<\/p>\n<p>Si vous n&rsquo;avez pas lu <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"l&#039;article pr\u00e9c\u00e9dent\">l&rsquo;article pr\u00e9c\u00e9dent<\/a><\/strong>, je vous recommande de le faire avant de continuer car il couvre les concepts d&rsquo;abstraction, d&rsquo;encapsulation et son lien avec WordPress.<\/p>\n<h3>3 H\u00e9ritage<\/h3>\n<p>Le concept d&rsquo;h\u00e9ritage est assez facile \u00e0 suivre. Autrement dit, une classe peut h\u00e9riter des attributs d&rsquo;une autre classe. Je vais en donner quelques exemples dans un instant, mais permettez-moi de fournir une d\u00e9finition de travail aux fins de cet article\u00a0:<\/p>\n<blockquote>\n<p>L&rsquo;h\u00e9ritage fait r\u00e9f\u00e9rence \u00e0 l&rsquo;id\u00e9e qu&rsquo;une classe, bien qu&rsquo;elle ait sa propre impl\u00e9mentation, h\u00e9rite litt\u00e9ralement des propri\u00e9t\u00e9s, des fonctions et de l&rsquo;impl\u00e9mentation g\u00e9n\u00e9rale d&rsquo;une classe parent.<\/p>\n<\/blockquote>\n<h4>Exemple 1\u00a0: un document<\/h4>\n<p>En termes tr\u00e8s simples, disons que vous avez une classe appel\u00e9e Document et qu&rsquo;un document a un titre et un contenu. Ensuite, il y a une sous-classe de document qui a des attributs pour une date et une heure. Nous pourrions appeler cela un PostDocument ou un PageDocument.<\/p>\n<p>Autrement dit, le PageDocument <strong>h\u00e9rite<\/strong> des propri\u00e9t\u00e9s et des attributs de Document tout en y ajoutant sa propre impl\u00e9mentation. Avoir du sens\u00a0?<\/p>\n<p>Sinon, ne vous inqui\u00e9tez pas. Il ne &quot;clique&quot; pas toujours au d\u00e9but, alors regardons un autre exemple.<\/p>\n<h4>Exemple 2\u00a0: un message<\/h4>\n<p>Disons que nous avons une classe Message. Un message a g\u00e9n\u00e9ralement deux propri\u00e9t\u00e9s\u00a0:<\/p>\n<ul>\n<li>1 Un exp\u00e9diteur,<\/li>\n<li>2 Un destinataire.<\/li>\n<\/ul>\n<p>Il est juste de dire qu&rsquo;il existe diff\u00e9rents types de messages, n&rsquo;est-ce pas\u00a0? Autrement dit, nous avons peut-\u00eatre un EmailMessage ou peut-\u00eatre un TextMessage.<\/p>\n<p>Un EmailMessage a toujours un exp\u00e9diteur et a toujours un destinataire, mais il a tellement plus, n&rsquo;est-ce pas\u00a0? Il a des choses comme :<\/p>\n<ul>\n<li>une ligne d&rsquo;objet,<\/li>\n<li>une pi\u00e8ce jointe facultative,<\/li>\n<li>un autre ensemble d&rsquo;exp\u00e9diteurs auxquels il est envoy\u00e9,<\/li>\n<li>prise en charge de la copie d&rsquo;autres personnes vers le message publiquement ou en priv\u00e9,<\/li>\n<li>et beaucoup plus.<\/li>\n<\/ul>\n<p>Un TextMessage, d&rsquo;autre part, n&rsquo;aura pas n\u00e9cessairement tout ce qui pr\u00e9c\u00e8de. Supposons que nous parlons d&rsquo;un message SMS de base (par rapport \u00e0 un message texte enrichi dans quelque chose comme Hangouts, Telegram, iMessage ou tout ce qui existe).<\/p>\n<p>Cette classe va :<\/p>\n<ul>\n<li>\u00eatre li\u00e9 \u00e0 un num\u00e9ro de t\u00e9l\u00e9phone,<\/li>\n<li>peut inclure un groupe d&rsquo;autres destinataires qui sont tous publics,<\/li>\n<li>un op\u00e9rateur (c&rsquo;est-\u00e0-dire un fournisseur de t\u00e9l\u00e9phonie mobile),<\/li>\n<li>un nombre maximum de caract\u00e8res qu&rsquo;il peut contenir<\/li>\n<li>la possibilit\u00e9 de diviser un seul message en plusieurs messages si le nombre maximum de caract\u00e8res d\u00e9passe un certain nombre de caract\u00e8res.<\/li>\n<\/ul>\n<p>Mais cela soul\u00e8ve toujours des questions sur les propri\u00e9t\u00e9s et les m\u00e9thodes (ou, plus g\u00e9n\u00e9ralement, la mise en \u0153uvre, n&rsquo;est-ce pas\u00a0?)<\/p>\n<h4>Un mot sur la mise en \u0153uvre<\/h4>\n<p>En mati\u00e8re de programmation orient\u00e9e objet, nous avons ce que nous appelons des modificateurs d&rsquo;acc\u00e8s. Peut-\u00eatre les avez-vous lus ailleurs, appel\u00e9s, disons, modificateurs de visibilit\u00e9 ou quelque chose comme \u00e7a.<\/p>\n<p>C&rsquo;est tout pareil.<\/p>\n<p>En bref, ces modificateurs peuvent \u00eatre d\u00e9finis comme\u00a0:<\/p>\n<blockquote>\n<p>Mots-cl\u00e9s qui contr\u00f4lent ce que les autres classes ont acc\u00e8s aux informations disponibles.<\/p>\n<\/blockquote>\n<p>Heureusement, cette partie est simple \u00e0 comprendre\u00a0:<\/p>\n<ul>\n<li><strong>les propri\u00e9t\u00e9s et fonctions priv\u00e9es<\/strong> ne sont accessibles qu&rsquo;\u00e0 la classe dans laquelle elles sont d\u00e9finies. Cela signifie que PostDocument ne peut rien utiliser dans Document marqu\u00e9 comme priv\u00e9. \u00c0 toutes fins utiles, PostDocument n&rsquo;est m\u00eame pas au courant de l&rsquo;existence de ces informations.<\/li>\n<li><strong>les propri\u00e9t\u00e9s et fonctions prot\u00e9g\u00e9es<\/strong> sont accessibles \u00e0 la classe dans laquelle elles sont d\u00e9finies et \u00e0 toute classe qui en est la descendante. Autrement dit, toute classe qui h\u00e9rite des donn\u00e9es de la classe de base ou de la classe parent y a acc\u00e8s. Ainsi, contrairement aux d\u00e9tails d&rsquo;impl\u00e9mentation <strong>priv\u00e9s<\/strong>, le PostDocument peut acc\u00e9der aux informations de Document s&rsquo;il est marqu\u00e9 comme prot\u00e9g\u00e9.<\/li>\n<li><strong>les<\/strong> propri\u00e9t\u00e9s et les fonctions publiques sont accessibles \u00e0 tous. Cela n&rsquo;a rien \u00e0 voir avec l&rsquo;h\u00e9ritage, vraiment, mais plut\u00f4t avec l&rsquo;encapsulation, le cas \u00e9ch\u00e9ant. Au lieu de cela, il s&rsquo;agit de d\u00e9cider \u00e0 quoi nous voulons que les autres objets acc\u00e8dent.<\/li>\n<\/ul>\n<p>Alors, comment la mise en \u0153uvre est-elle g\u00e9r\u00e9e? Cela varie d&rsquo;une langue \u00e0 l&rsquo;autre, mais PHP ne prend pas en charge ce qu&rsquo;on appelle &quot;l&rsquo;h\u00e9ritage multiple&quot;. En termes simples, une classe donn\u00e9e en <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP ne peut h\u00e9riter (ou \u00e9tendre) qu&rsquo;une seule autre classe<\/a>. Pas plusieurs classes (certaines langues le supportent).<\/p>\n<blockquote>\n<p>Lorsque vous \u00e9tendez une classe, la sous-classe h\u00e9rite de toutes les m\u00e9thodes publiques et prot\u00e9g\u00e9es de la classe parent. \u00c0 moins qu&rsquo;une classe ne remplace ces m\u00e9thodes, elles conserveront leur fonctionnalit\u00e9 d&rsquo;origine.<\/p>\n<\/blockquote>\n<p>Dans notre exemple, nous ne pouvons pas introduire une autre classe telle que WrittenDocument qui h\u00e9rite de PageDocument ainsi que de PostDocument. C&rsquo;est soit l&rsquo;un soit l&rsquo;autre. Et il convient de noter que s&rsquo;il h\u00e9rite de PostDocument, il h\u00e9rite \u00e9galement des informations de Document car il s&rsquo;agit d&rsquo;une sous-classe d&rsquo;une sous-classe d&rsquo;une classe.<\/p>\n<h3>4 Polymorphisme<\/h3>\n<p>Maintenant que nous avons une d\u00e9finition de base de l&rsquo;h\u00e9ritage en place, nous pouvons parler de polymorphisme. La bonne nouvelle est qu&rsquo;il s&rsquo;agit d&rsquo;un mot large et \u00e9trange pour un concept tr\u00e8s simple.<\/p>\n<p>La mauvaise nouvelle est que nous n&rsquo;avons pas parl\u00e9 d&rsquo;interfaces ou de classes abstraites. Celles-ci arrivent, mais elles sont consid\u00e9r\u00e9es comme faisant partie des quatre piliers, alors ne vous en souciez pas pour le moment.<\/p>\n<p>Pensez-y plut\u00f4t\u00a0:<\/p>\n<blockquote>\n<p>Le polymorphisme nous permet de faire r\u00e9f\u00e9rence \u00e0 une classe d&rsquo;un type lorsqu&rsquo;elle peut \u00eatre d\u00e9clar\u00e9e comme un autre type.<\/p>\n<\/blockquote>\n<p>Cela peut encore pr\u00eater \u00e0 confusion, mais souvenez-vous de notre exemple de message ci-dessus\u00a0? Nous pouvons instancier une classe SMSMessage qui <strong>\u00e9tend<\/strong> la classe Message, puis appeler certaines m\u00e9thodes sur celle-ci.<\/p>\n<p>Le SMSMessage peut avoir une m\u00e9thode que la classe Message a. Et si la classe a \u00e9t\u00e9 instanci\u00e9e en tant qu&rsquo;instance de la classe SMSMessage, elle appellera cette m\u00e9thode. De m\u00eame, s&rsquo;il n&rsquo;a pas de m\u00e9thode mais que sa classe parent, Message, l&rsquo;a, alors il appellera cette m\u00e9thode.<\/p>\n<p>Parfois, il est plus facile de comprendre cela dans le code, alors faisons cela.<\/p>\n<p>Commen\u00e7ons par d\u00e9finir notre classe <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Message<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nclass Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the Message class.n\";\n  }\n\n  public function receive()\n  {\n    echo \"This message was received from the Message class.n\";\n  }\n}\n<\/code><\/pre>\n<p>D\u00e9finissons ensuite notre classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage<\/a>. Notez qu&rsquo;il n&rsquo;a pas de fonction <strong>receive()<\/strong>. Ce sera important momentan\u00e9ment :<\/p>\n<pre><code>&lt;?php\nclass SMSMessage extends Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the SMSMessage class.n\";\n  }\n}<\/code><\/pre>\n<p>Maintenant, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instancions notre<\/a><\/strong> classe Message et appelons quelques m\u00e9thodes\u00a0:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Et faisons de m\u00eame <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en utilisant la classe SMSMessage :<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Si vous voulez le script complet, vous pouvez le voir <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ici<\/a><\/strong>, le <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e9l\u00e9charger<\/a> et l&rsquo;ex\u00e9cuter localement.<\/p>\n<h2>H\u00e9ritage, polymorphisme et WordPress<\/h2>\n<p>Voici ce qu&rsquo;il faut retenir (et nous l&rsquo;explorerons davantage lorsque nous aborderons les interfaces et les classes abstraites)\u00a0: lorsqu&rsquo;une classe <strong>\u00e9tend<\/strong> une autre classe et qu&rsquo;elle n&rsquo;a pas les d\u00e9tails d&rsquo;impl\u00e9mentation de sa classe parent, l&rsquo;impl\u00e9mentation du parent sera utilis\u00e9e.<\/p>\n<p>Une autre fa\u00e7on de penser est de \u00abremonter la cha\u00eene de commandement \u00bb. Cela commencera par la classe la plus basse de ce que nous avons cr\u00e9\u00e9. Dans notre exemple ci-dessus, c&rsquo;est le SMSMessage. S&rsquo;il ne le trouve pas, il remontera dans la classe qu&rsquo;il \u00e9tend. (Et s&rsquo;il ne le trouve pas l\u00e0 et que cette classe \u00e9tend une classe, il essaiera l\u00e0.)<\/p>\n<p>Toute la chose polymorphe est la suivante: nous avons instanci\u00e9 une classe d&rsquo;un type, SMSMessage, mais elle utilise l&rsquo;impl\u00e9mentation d&rsquo;une classe d&rsquo;un autre type (dont elle h\u00e9rite, oui, mais c&rsquo;est quand m\u00eame diff\u00e9rent).<\/p>\n<h3>Cours d&rsquo;\u00e9criture sur WordPress<\/h3>\n<p>Enfin, j&rsquo;aimerais vous laisser avec ceci\u00a0: j&rsquo;ai mentionn\u00e9 quelque chose de similaire \u00e0 cela dans le post pr\u00e9c\u00e9dent, mais je veux le r\u00e9p\u00e9ter ici.<\/p>\n<p>Quel que soit le nombre de ces concepts utilis\u00e9s par le c\u0153ur de WordPress, cela n&rsquo;a pas d&rsquo;importance car nous pouvons \u00e9crire du code orient\u00e9 objet de haute qualit\u00e9 sur WordPress qui interagit avec WordPress et qui fonctionne bien avec WordPress (et d&rsquo;autres codes tiers &#8211; pas toujours, mais plusieurs fois).<\/p>\n<h2>Quoi de neuf ensuite\u00a0?<\/h2>\n<p>Ensuite, nous examinerons les interfaces et les abstractions.<\/p>\n<p>Celles-ci sont toujours fondamentales pour la programmation orient\u00e9e objet, mais si vous avez compris les deux articles pr\u00e9c\u00e9dents, vous \u00eates pr\u00eat pour une solide exp\u00e9rience avec les concepts \u00e0 venir.<\/p>\n<p>Et si ce n&rsquo;est pas le cas, ne vous inqui\u00e9tez pas! Vous pouvez toujours en parler dans les commentaires ou nous pouvons en discuter davantage par e-mail.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ici, je conclus mes deux articles sur les quatre piliers de la POO couvrant l&rsquo;h\u00e9ritage et le polymorphisme avec une d\u00e9monstration fonctionnelle.<\/p>\n","protected":false},"author":1,"featured_media":164983,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,841],"tags":[1167],"class_list":["post-230076","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230076","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230076"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230076\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}