{"id":230161,"date":"2022-11-23T19:08:00","date_gmt":"2022-11-23T16:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230161"},"modified":"2022-11-23T19:09:04","modified_gmt":"2022-11-23T16:09:04","slug":"examiner-le-polymorphisme-en-profondeur","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/examiner-le-polymorphisme-en-profondeur\/","title":{"rendered":"Examiner le polymorphisme en profondeur"},"content":{"rendered":"\n<p>Lorsque j&rsquo;ai commenc\u00e9 cette s\u00e9rie, j&rsquo;ai parl\u00e9 des quatre piliers de la programmation orient\u00e9e objet. Chacun de ces sujets est r\u00e9pertori\u00e9 et li\u00e9 ci-dessous.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"Abstraction\">Abstraction<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"Encapsulation\">Encapsulation<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-deuxiemes-piliers-de-la-poo\/\" title=\"H\u00e9ritage\">H\u00e9ritage<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-deuxiemes-piliers-de-la-poo\/\" title=\"Polymorphisme\">Polymorphisme<\/a><\/strong><\/li>\n<\/ol>\n<p>\u00c0 ce stade, je voudrais normalement commencer \u00e0 passer au sujet suivant. Avant de le faire, cependant, j&rsquo;aimerais passer un article de plus \u00e0 explorer le concept de polymorphisme.<\/p>\n<p>Dans ma carri\u00e8re, jusqu&rsquo;\u00e0 pr\u00e9sent, j&rsquo;ai vu peu de sujets donner \u00e0 ceux qui se lancent dans la programmation orient\u00e9e objet plus de confusion et de probl\u00e8mes que le polymorphisme. J&rsquo;aimerais donc en discuter un peu plus en profondeur dans le contexte de la programmation orient\u00e9e objet et en dehors de tout cadre ou application particulier (comme WordPress).<\/p>\n<p>Dans cet article, je ferai un bref examen de ce dont nous avons discut\u00e9 jusqu&rsquo;\u00e0 pr\u00e9sent, puis je reviendrai dans le polymorphisme.<\/p>\n<h2>Polymorphisme en profondeur<\/h2>\n<p>Tout d&rsquo;abord, comme mentionn\u00e9, je souhaite passer rapidement en revue ce qui a \u00e9t\u00e9 discut\u00e9 jusqu&rsquo;\u00e0 pr\u00e9sent, surtout si vous avez pass\u00e9 sous silence l&rsquo;un des messages pr\u00e9c\u00e9dents.<\/p>\n<p>Ne vous inqui\u00e9tez pas\u00a0: rien ci-dessous ne digresse dans le code. Au lieu de cela, il d\u00e9finit simplement les termes que nous avons utilis\u00e9s afin que vous ayez une id\u00e9e de ce \u00e0 quoi je fais r\u00e9f\u00e9rence chaque fois que vous voyez le mot appara\u00eetre tout au long de cette s\u00e9rie.<\/p>\n<h3>Abstraction<\/h3>\n<blockquote>\n<p>Nous faisons abstraction de l&rsquo;id\u00e9e de quelque chose dans une classe. Au lieu de cela, nous allons extraire des id\u00e9es dans leurs classes. Et il y a une id\u00e9e cl\u00e9 ici: une classe doit repr\u00e9senter un nom.<\/p>\n<\/blockquote>\n<h3>Encapsulation<\/h3>\n<blockquote>\n<p>L&rsquo;encapsulation n&rsquo;est vraiment qu&rsquo;un \u00abgrand\u00bb mot qui fait r\u00e9f\u00e9rence \u00e0 l&rsquo;id\u00e9e de g\u00e9rer ses responsabilit\u00e9s (ou de garder une trace de ses donn\u00e9es).<\/p>\n<\/blockquote>\n<h3>H\u00e9ritage<\/h3>\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<h3>Polymorphisme<\/h3>\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 dit, c&rsquo;est l\u00e0 que je pense que les choses peuvent devenir un peu plus compliqu\u00e9es. Dans les articles pr\u00e9c\u00e9dents, j&rsquo;ai fourni un certain nombre d&rsquo;exemples de code diff\u00e9rents (et je vous invite \u00e0 les consulter).<\/p>\n<p>Mais dans le post d&rsquo;aujourd&rsquo;hui, je vais essayer d&rsquo;explorer l&rsquo;id\u00e9e un peu plus loin \u00e0 la fois dans l&rsquo;explication puis dans le code.<\/p>\n<h2>Relatif \u00e0 l&rsquo;h\u00e9ritage<\/h2>\n<p>Si ce n&rsquo;est pas \u00e9vident \u00e0 ce stade, le polymorphisme est fortement li\u00e9 \u00e0 l&rsquo;h\u00e9ritage. Pensez-y de cette fa\u00e7on\u00a0: si une classe h\u00e9rite des propri\u00e9t\u00e9s et des m\u00e9thodes d&rsquo;une autre classe, elle peut alors &quot;remplacer&quot; la classe parent.<\/p>\n<p>Cela signifie que si vous avez quelque chose comme une\u00a0 classe <strong>Content<\/strong> et que vous avez ensuite deux sous-classes, l&rsquo;une \u00e9tant un <strong>Post<\/strong> et l&rsquo;autre \u00e9tant une <strong>Page<\/strong>, vous pouvez instancier la classe en utilisant le\u00a0 type de r\u00e9f\u00e9rence <strong>Content.t<\/strong><\/p>\n<p>Mais au moment de l&rsquo;ex\u00e9cution, il s&rsquo;agira en fait d&rsquo;une instance du\u00a0 type <strong>Post<\/strong>. Avoir du sens\u00a0? Voici un code \u00e0 titre d&rsquo;exemple.<\/p>\n<p>Tout d&rsquo;abord, nous allons commencer par d\u00e9finir une\u00a0 classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Content<\/a> :<\/p>\n<pre><code>&lt;?php\nclass Content {\n\n   protected $title;\n\n   protected $content;\n\n   protected $metadata;\n\n   public function __construct()\n   {\n     $this-&gt;title = \"Hello World!\";\n     $this-&gt;content = \"This is a sample piece of content.\";\n     $this-&gt;metadata = \"&lt;This is the metadata of the post.&gt;\";\n   }\n\n   public function getTitle()\n   {\n     return $this-&gt;title;\n   }\n\n   public function getContent()\n   {\n     return $this-&gt;content;\n   }\n\n   public function getMetadata()\n   {\n     return $this-&gt;metadata;\n   }\n }\n<\/code><\/pre>\n<p>Il poss\u00e8de les propri\u00e9t\u00e9s g\u00e9n\u00e9rales auxquelles vous vous attendez probablement: titre, contenu et m\u00e9tadonn\u00e9es. Certes, ces propri\u00e9t\u00e9s ne sont que des cha\u00eenes, mais elles pourraient \u00eatre des structures de donn\u00e9es plus \u00e9labor\u00e9es dans une situation r\u00e9elle.<\/p>\n<p>Regardons maintenant un <strong>Post<\/strong> :<\/p>\n<pre><code>&lt;?php\n\nclass Post extends Content  {\n\n   private $author;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;author = \"Tom McFarlin\";\n   }\n\n   public function getAuthor()\n   {\n     return $this-&gt;author;\n   }\n }\n<\/code><\/pre>\n<p>Que se passe-t-il alors si vous appelez une m\u00e9thode sur la\u00a0 classe <strong>Post<\/strong>, comme <strong>getTitle<\/strong>, qui n&rsquo;existe pas mais qui existe dans la\u00a0 classe <strong>Content<\/strong>? Ensuite, \u00e0 cause de l&rsquo;h\u00e9ritage, il recherchera la m\u00e9thode dans <strong>Post<\/strong>, ne la trouvera pas, puis commencera \u00e0 la rechercher dans <strong>Content<\/strong>.<\/p>\n<p>S&rsquo;il est trouv\u00e9, il l&rsquo;ex\u00e9cutera.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6c3e3d0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6c3e3d0.png\" alt=\"Examiner le polymorphisme en profondeur\"><\/a><\/p>\n<p>De m\u00eame, nous pouvons faire quelque chose comme \u00e7a avec la\u00a0 classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Page<\/a> et les donn\u00e9es de contenu. Tout d&rsquo;abord, nous instancions la classe de base puis nous d\u00e9finissons les propri\u00e9t\u00e9s sp\u00e9cifiques \u00e0 la <strong>Page<\/strong>. Dans ce cas, ce sera une cat\u00e9gorie.<\/p>\n<pre><code>&lt;?php\n\nclass Page extends Content  {\n\n   private $category;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;category = \"Articles\";\n   }\n\n   public function getCategory()\n   {\n     return $this-&gt;category;\n   }\n }\n<\/code><\/pre>\n<p>Maintenant, lorsque nous ex\u00e9cutons le code, nous pouvons commencer par le <strong>contenu\u00a0:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>Notez que cela ressemble \u00e0 ce \u00e0 quoi nous nous attendions puisque nous avons un titre et que nous avons du contenu. Regardons aussi le <strong>Post<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Cela fonctionne parce que nous avons un auteur mais nous avons aussi un titre car il r\u00e9side dans <strong>Content<\/strong>. Mais si nous essayons d&rsquo;appeler <strong>getAuthor<\/strong> sur une instance de <strong>Post?<\/strong><\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Nous allons obtenir une erreur car la m\u00e9thode ne r\u00e9side pas dans cette classe.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6f7949a.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6f7949a.png\" alt=\"Examiner le polymorphisme en profondeur\"><\/a><\/p>\n<p>Alors, que devons-nous faire? Comme nous n&rsquo;avons pas de types forts en PHP, nous ne pouvons pas le convertir en un type diff\u00e9rent.<\/p>\n<p>Il existe des mod\u00e8les de conception pour cela, dont je parlerai dans une prochaine s\u00e9rie d&rsquo;articles, mais PHP ne le permet pas aussi facilement que d&rsquo;autres langages (comme C# ou Java).<\/p>\n<h2>Questions sur le polymorphisme<\/h2>\n<p>Esp\u00e9rons que le code ci-dessus vous donne une id\u00e9e de la fa\u00e7on dont un type concret tel qu&rsquo;un <strong>Post\u00a0<\/strong> ou une <strong>Page<\/strong> peut implicitement avoir les propri\u00e9t\u00e9s et les m\u00e9thodes de sa classe de base, <strong>Content<\/strong>, utilis\u00e9es lors de l&rsquo;ex\u00e9cution.<\/p>\n<p>Mais cela soul\u00e8ve aussi quelques questions, n&rsquo;est-ce pas? Par exemple:<\/p>\n<ul>\n<li><strong>Pourquoi le polymorphisme est-il utile ?<\/strong> En fin de compte, c&rsquo;est une question de flexibilit\u00e9. Autrement dit, vous pouvez \u00e9crire un\u00a0 type <strong>de contenu<\/strong> g\u00e9n\u00e9rique, mais ensuite cr\u00e9er un <strong>article<\/strong> ou une <strong>page<\/strong>, comme nous l&rsquo;avons vu ci-dessus. Cela nous donne alors tous les avantages de la\u00a0 classe <strong>Content<\/strong> tout en nous donnant \u00e9galement la sp\u00e9cificit\u00e9 de la\u00a0 classe <strong>Post<\/strong> par exemple.<\/li>\n<li><strong>Cela semble \u00eatre plus d\u00e9routant que flexible.<\/strong> D&rsquo;une certaine mani\u00e8re, c&rsquo;est d\u00e9routant car le code n\u00e9cessite un peu de tra\u00e7age. Autrement dit, vous pourriez commencer dans la\u00a0 classe <strong>Post<\/strong> et devoir rechercher ce que propose la classe <strong>Content .<\/strong> D&rsquo;un autre c\u00f4t\u00e9, il est \u00e9galement tr\u00e8s facile d&rsquo;introduire une nouvelle\u00a0 sous-classe <strong>de contenu<\/strong>, puis de l&rsquo;utiliser lorsqu&rsquo;elle est la mieux adapt\u00e9e \u00e0 l&rsquo;ex\u00e9cution.<\/li>\n<\/ul>\n<p>En ce qui concerne les superclasses et les sous-classes, c&rsquo;est l\u00e0 qu&rsquo;un IDE solide entre en jeu.<\/p>\n<p>C&rsquo;est toujours agr\u00e9able d&rsquo;avoir un \u00e9diteur que vous aimez, bien s\u00fbr, mais en avoir un qui peut d\u00e9terminer intuitivement quelle est la classe parent, quelle est la classe de base, etc., peut grandement aider \u00e0 tracer, d\u00e9boguer, suivre et \u00e9crire de nouveaux code.<\/p>\n<p>Mais c&rsquo;est le contenu d&rsquo;un autre article qui viendra apr\u00e8s que nous ayons parl\u00e9 des mod\u00e8les de conception.<\/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>Examinons le polymorphisme en profondeur pour avoir une id\u00e9e plus claire de son fonctionnement et de ses avantages.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801,841],"tags":[1167],"class_list":["post-230161","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","category-tutoriels","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230161","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=230161"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230161\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}