{"id":231058,"date":"2022-12-14T14:01:00","date_gmt":"2022-12-14T11:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231058"},"modified":"2022-12-14T14:02:36","modified_gmt":"2022-12-14T11:02:36","slug":"widgets-wordpress-detecter-la-programmation-orientee-objet","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-detecter-la-programmation-orientee-objet\/","title":{"rendered":"Widgets WordPress\u00a0: d\u00e9tecter la programmation orient\u00e9e objet"},"content":{"rendered":"\n<p>Si vous n&rsquo;avez pas lu le premier article de cette s\u00e9rie, je le recommande, car nous commen\u00e7ons \u00e0 \u00e9crire du code orient\u00e9 objet pour WordPress gr\u00e2ce \u00e0 l&rsquo;utilisation de l&rsquo; <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets.<\/a><\/strong><\/p>\n<p>La s\u00e9rie va capturer quelques choses:<\/p>\n<ol>\n<li>vous montrer le squelette de base d&rsquo;un widget et pourquoi il est orient\u00e9 objet,<\/li>\n<li>discuter des choses que vous devriez \u00eatre en mesure de remarquer et pourquoi<\/li>\n<li>mettez d&rsquo;abord \u00e0 jour le Widget Boilerplate directement sur ce site, puis envoyez-le \u00e0 GitHub,<\/li>\n<li>construire un widget en utilisant l&rsquo;API avec le passe-partout comme base de notre travail.<\/li>\n<\/ol>\n<p>Mais avant de faire cela, je veux m&rsquo;assurer que tous ceux qui lisent ceci connaissent les principes fondamentaux de la programmation orient\u00e9e objet et disposent de tout le n\u00e9cessaire pour cr\u00e9er une solution orient\u00e9e objet pour WordPress.<\/p>\n<p>\u00c0 cette fin, je recommande ce qui suit\u00a0:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-premiers-piliers-de-la-poo\/\" title=\"Deux piliers de la programmation orient\u00e9e objet: partie 1 sur 2\">Deux piliers de la programmation orient\u00e9e objet: partie 1 sur 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-deux-deuxiemes-piliers-de-la-poo\/\" title=\"Deux piliers de la programmation orient\u00e9e objet: partie 2 sur 2\">Deux piliers de la programmation orient\u00e9e objet: partie 2 sur 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/classes-abstraites-partie-1-comportement-dabstraction\/\" title=\"Classes abstraites, partie 1 - Comportement d&#039;abstraction\">Classes abstraites, partie 1 &#8211; Comportement d&rsquo;abstraction<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/classes-abstraites-partie-2-classes-abstraites-et-interfaces\/\" title=\"Classes abstraites, partie 2 \u2013 Classes abstraites et interfaces\">Classes abstraites, partie 2 \u2013 Classes abstraites et interfaces<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Le D\u00e9veloppeur WordPress Ind\u00e9pendant<\/a><\/strong><\/li>\n<\/ol>\n<p>Si vous avez lu tout ce contenu, tant mieux. Vous allez \u00eatre bien pr\u00e9par\u00e9 pour cet article et les articles \u00e0 venir. Sinon, il peut y avoir des trous dans le reste de ce que vous \u00eates sur le point de lire, mais l&rsquo;essentiel du message doit \u00eatre suffisamment clair.<\/p>\n<h3>Quel est le probl\u00e8me, exactement\u00a0?<\/h3>\n<p>Voici le truc\u00a0: <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-une-approche-orientee-objet\/\" title=\"la semaine derni\u00e8re\">la semaine derni\u00e8re<\/a><\/strong>, j&rsquo;ai partag\u00e9 un peu de code avec des informations sur l&rsquo; <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets<\/a><\/strong>. Je vais y revenir un peu plus dans cet article avant d&rsquo;entrer dans la partie la plus intensive en codage pour deux raisons\u00a0:<\/p>\n<ol>\n<li>Je veux que tous ceux qui lisent ceci soient sur la m\u00eame page en ce qui concerne l&rsquo;\u00e9criture de code orient\u00e9 objet (\u00e0 tout le moins, dans ce contexte),<\/li>\n<li>Je reconnais que les gens viennent d&rsquo;horizons diff\u00e9rents et je veux m&rsquo;assurer que nous sommes tous sur la m\u00eame page autant que possible avant de continuer.<\/li>\n<\/ol>\n<p>Si vous avez de l&rsquo;exp\u00e9rience dans l&rsquo;\u00e9criture de code orient\u00e9 objet, en particulier \u00e0 un niveau avanc\u00e9, cela peut vous sembler plus simple ; sinon, j&rsquo;esp\u00e8re que cela vous fournira tout ce dont vous avez besoin pour d\u00e9tecter les pratiques orient\u00e9es objet non seulement concernant cette API, mais \u00e9galement lors de la lecture du code des autres.<\/p>\n<h2>Comment d\u00e9tecter la programmation orient\u00e9e objet<\/h2>\n<p>Peut-\u00eatre une premi\u00e8re question naturelle est pourquoi devons-nous \u00eatre capables de d\u00e9tecter, lire ou comprendre la programmation orient\u00e9e objet avant de l&rsquo;\u00e9crire r\u00e9ellement ?<\/p>\n<h3>Un mot sur le mauvais code<\/h3>\n<p>La r\u00e9ponse courte \u00e0 cela est la suivante\u00a0:<\/p>\n<p>Vous n&rsquo;en avez pas besoin, mais c&rsquo;est utile. Si vous \u00eates capable de lire la programmation orient\u00e9e objet, vous aurez une longueur d&rsquo;avance en tirant parti de ce qu&rsquo;elle offre comme paradigme, car vous allez vous appuyer sur les strat\u00e9gies et le travail effectu\u00e9 par d&rsquo;autres dans d&rsquo;autres projets.<\/p>\n<p>Cela ne veut pas dire que nous ne lirons pas le mauvais code, mais nous ferons tout notre possible pour identifier le mauvais code, identifier les zones probl\u00e9matiques, puis faire ce que nous pouvons pour \u00e9viter de l&rsquo;incorporer dans notre travail.<\/p>\n<p>Pour l&rsquo;instant, examinons l&rsquo; <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets<\/a><\/strong> pour voir ce que nous pouvons faire pour d\u00e9tecter la programmation orient\u00e9e objet.<\/p>\n<h3>Retour \u00e0 la programmation orient\u00e9e objet<\/h3>\n<p>Dans le post pr\u00e9c\u00e9dent, j&rsquo;ai soulign\u00e9 deux choses qui indiquent que l&rsquo;API est orient\u00e9e objet (au moins dans une certaine mesure)\u00a0:<\/p>\n<ol>\n<li>l&rsquo;utilisation du mot cl\u00e9 extend<strong>,<\/strong><\/li>\n<li>fonctions que nous devons impl\u00e9menter.<\/li>\n<\/ol>\n<p>La raison pour laquelle je souhaite revenir sur ce sujet est qu&rsquo;il identifie deux \u00e9l\u00e9ments cl\u00e9s qui font partie des principes fondamentaux orient\u00e9s objet\u00a0: l&rsquo; <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e9ritage<\/a><\/strong> et l&rsquo;impl\u00e9mentation de fonctions (qui font souvent partie de <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">classes abstraites<\/a><\/strong> ).<\/p>\n<p>Une note avant de regarder ce qui pr\u00e9c\u00e8de:<\/p>\n<p>Lorsque vous regardez <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la source de la classe WP_Widget<\/a><\/strong>, vous remarquerez qu&rsquo;il n&rsquo;y a pas de m\u00e9thodes abstraites. Mais certaines des fonctions que nous devons impl\u00e9menter, que je mentionnerai plus tard dans cet article, sont des candidats de choix pour les m\u00e9thodes abstraites. Et je vais discuter pourquoi, aussi.<\/p>\n<p>S\u00e9parons les sujets ci-dessus en deux sections distinctes\u00a0: H\u00e9ritage et Abstractions.<\/p>\n<h3>H\u00e9ritage<\/h3>\n<p>J&rsquo;ai couvert l&rsquo;h\u00e9ritage est une profondeur relative <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-une-approche-orientee-objet\/\" title=\"dans le post pr\u00e9c\u00e9dent\">dans le post pr\u00e9c\u00e9dent<\/a><\/strong>, donc je n&rsquo;insisterai pas sur le point ici. Je vais offrir quelques mots, mais je suis beaucoup plus int\u00e9ress\u00e9 \u00e0 discuter de l&rsquo;abstraction, ce que je ferai dans un instant.<\/p>\n<p>Avant d&rsquo;aller trop loin dans cela, cependant, veuillez vous r\u00e9f\u00e9rer au <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">code suivant :<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Mais d&rsquo;abord, nous pouvons reconna\u00eetre que toute classe qui impl\u00e9mente l&rsquo;API Widgets doit utiliser l&rsquo;h\u00e9ritage simplement \u00e0 cause du mot cl\u00e9 <strong>extend<\/strong>.<\/p>\n<p>Cela signifie qu&rsquo;il y a un niveau de fonctionnalit\u00e9 dont nous allons h\u00e9riter (ou obtenir gratuitement) et il y a un niveau de fonctionnalit\u00e9 que nous devons impl\u00e9menter par nous-m\u00eames.<\/p>\n<p>Du <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">manuel PHP<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Par exemple, 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>Cependant, lorsque vous h\u00e9ritez des fonctionnalit\u00e9s d&rsquo;une classe, vous pouvez trouver qu&rsquo;il est important d&rsquo;appeler strictement le constructeur du parent (dans notre fonction <strong>__construct<\/strong> ).<\/p>\n<p>Mais cela soul\u00e8ve ce que je pense \u00eatre l&rsquo;un des probl\u00e8mes les plus importants avec l&rsquo;h\u00e9ritage en PHP (et la raison pour laquelle je voulais inclure cette section): Avons-nous besoin d&rsquo;appeler explicitement le constructeur parent ?<\/p>\n<p>Toujours selon <strong><a href=\"http:\/\/www.php.net\/manual\/en\/language.oop5.decon.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le manuel :<\/a><\/strong><\/p>\n<blockquote>\n<p>Les constructeurs parents ne sont pas appel\u00e9s implicitement si la classe enfant d\u00e9finit un constructeur. Pour ex\u00e9cuter un constructeur parent, un appel \u00e0 <strong>parent :: __construct()<\/strong> dans le constructeur enfant est requis. Si l&rsquo;enfant ne d\u00e9finit pas de constructeur, il peut \u00eatre h\u00e9rit\u00e9 de la classe parent comme une m\u00e9thode de classe normale (si elle n&rsquo;a pas \u00e9t\u00e9 d\u00e9clar\u00e9e comme priv\u00e9e).<\/p>\n<\/blockquote>\n<p>Mais nous pouvons simplifier cela. C&rsquo;est peut-\u00eatre plus facile \u00e0 retenir :<\/p>\n<ol>\n<li>Si notre classe utilise l&rsquo;h\u00e9ritage mais ne d\u00e9finit pas de constructeur, le constructeur parent est appel\u00e9.<\/li>\n<li>Si notre classe utilise l&rsquo;h\u00e9ritage mais d\u00e9finit un constructeur, la construction parent doit \u00eatre explicitement appel\u00e9e.<\/li>\n<\/ol>\n<p>Ou peut-\u00eatre encore plus simplement :<\/p>\n<ul>\n<li>Si notre classe ne d\u00e9finit pas de constructeur, le code sera par d\u00e9faut le constructeur des parents.<\/li>\n<\/ul>\n<p>Avoir du sens\u00a0? En bref, si nous d\u00e9finissons nos propri\u00e9t\u00e9s, notre initialisation et notre code dans un constructeur, la premi\u00e8re ligne du constructeur de notre classe devrait \u00eatre un appel au constructeur parent.<\/p>\n<h3>Abstraction<\/h3>\n<p>Pour \u00eatre absolument clair, le code source de la classe <strong>WP_Widget<\/strong> n&rsquo;inclut pas de m\u00e9thodes abstraites. Cela est en partie li\u00e9 \u00e0 la mani\u00e8re dont la classe est construite, en partie \u00e0 la r\u00e9trocompatibilit\u00e9 et aux fonctionnalit\u00e9s de PHP5.<\/p>\n<p>Cela ne signifie pas pour autant que nous ne pouvons pas identifier quelles fonctions pourraient \u00eatre marqu\u00e9es comme <strong>abstract<\/strong>. En fait, je pense que cela explique quelles classes doivent \u00eatre rendues abstraites. Mais d&rsquo;abord, d\u00e9finissons les fonctions abstraites.<\/p>\n<p><strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Du manuel<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Lors de l&rsquo;h\u00e9ritage d&rsquo;une classe abstraite, toutes les m\u00e9thodes marqu\u00e9es abstraites dans la d\u00e9claration de classe du parent doivent \u00eatre d\u00e9finies par l&rsquo;enfant\u00a0; de plus, ces m\u00e9thodes doivent \u00eatre d\u00e9finies avec la m\u00eame visibilit\u00e9 (ou une visibilit\u00e9 moins restreinte).<\/p>\n<\/blockquote>\n<p>Lorsque vous regardez la source de notre widget\u00a0:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Je pense qu&rsquo;il est juste de dire que la fonction de <strong>formulaire<\/strong> pourrait \u00eatre marqu\u00e9e comme <strong>abstraite<\/strong> car elle est unique \u00e0 notre impl\u00e9mentation. Une autre fa\u00e7on de penser aux fonctions abstraites du point de vue de la programmation est de vous demander\u00a0: quelles fonctions n\u00e9cessiteront une fonctionnalit\u00e9 unique\u00a0?<\/p>\n<p>Et dans ce cas, la fonction de <strong>formulaire<\/strong> est pr\u00e9cis\u00e9ment cela, car chaque widget sera unique et diff\u00e9rent en ce qui concerne ce qu&rsquo;il affiche. La fonction de <strong>widget<\/strong> peut \u00e9galement \u00eatre marqu\u00e9e comme abstraite car elle affiche le contenu du widget. Ce contenu est, naturellement, bas\u00e9 sur la fonctionnalit\u00e9 que nous avons impl\u00e9ment\u00e9e dans notre impl\u00e9mentation.<\/p>\n<p>De plus, le code source de la classe <strong>WP_Widget<\/strong> lui-m\u00eame indique\u00a0:<\/p>\n<blockquote>\n<p>la fonction WP_Widget::widget() doit \u00eatre remplac\u00e9e dans une sous-classe.&rsquo;<\/p>\n<\/blockquote>\n<p>C&rsquo;est pr\u00e9cis\u00e9ment le type de fonction qui doit \u00eatre marqu\u00e9 comme abstrait. Parce que PHP lancera une erreur si une fonction est marqu\u00e9e comme abstraite et non impl\u00e9ment\u00e9e. Nous n&rsquo;avions pas besoin d&rsquo; appels de fonction <strong>die<\/strong> ou quoi que ce soit de ce genre.<\/p>\n<p>Les autres fonctions, cependant, n&rsquo;auront pas n\u00e9cessairement besoin d&rsquo;\u00eatre marqu\u00e9es comme abstraites et voici pourquoi :<\/p>\n<ol>\n<li><strong>__construct<\/strong> appellera le constructeur du parent, au niveau le plus basique, et cela est n\u00e9cessaire pour initialiser la classe de base. N&rsquo;oubliez pas, cependant; nous pouvons ajouter nos propri\u00e9t\u00e9s \u00e0 cette m\u00e9thode qui sont uniques \u00e0 notre classe.<\/li>\n<li><strong>update\u00a0<\/strong> utilise les fonctionnalit\u00e9s de la classe parent pour la s\u00e9rialisation des informations.<\/li>\n<\/ol>\n<p>Ainsi, il nous reste deux fonctions qui pourraient \u00eatre marqu\u00e9es comme abstraites dans une it\u00e9ration plus moderne de la classe.<\/p>\n<h2>Suivant<\/h2>\n<p>\u00c0 ce stade, nous devrions tous \u00eatre sur la m\u00eame page en ce qui concerne le code orient\u00e9 objet. Au moins autant que nous puissions passer \u00e0 travers une s\u00e9rie de billets de blog.<\/p>\n<p>\u00c0 partir du prochain article, nous allons revenir \u00e0 l&rsquo;\u00e9criture de code.<\/p>\n<p>Autrement dit, nous allons revoir le <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> et je vais le refactoriser dans son \u00e9tat actuel pour adopter des normes PHP plus modernes.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161697-61e7280e064dc.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-161697-61e7280e064dc.png\" alt=\"Widgets WordPress\u00a0: d\u00e9tecter la programmation orient\u00e9e objet\"><\/a><\/p>\n<p>Je vais partager les modifications que j&rsquo;apporte, les justifications du pourquoi, puis je parlerai \u00e9galement du type de widget que nous allons construire sur la base du passe-partout (et nous pouvons le faire).<\/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>L&rsquo;objectif est de vous armer de tout ce dont vous avez besoin pour d\u00e9tecter les pratiques orient\u00e9es objet \u00e0 la fois dans cette API et dans d&rsquo;autres.<\/p>\n","protected":false},"author":1,"featured_media":235594,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801,862],"tags":[1167],"class_list":["post-231058","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231058","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=231058"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231058\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/235594"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}