{"id":231179,"date":"2022-12-17T15:07:00","date_gmt":"2022-12-17T12:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231179"},"modified":"2022-12-17T15:09:18","modified_gmt":"2022-12-17T12:09:18","slug":"widgets-wordpress-refactorisation-partie-3","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-refactorisation-partie-3\/","title":{"rendered":"Widgets WordPress : refactorisation, partie 3"},"content":{"rendered":"\n<p>En termes de mise \u00e0 jour du WordPress Widget Boilerplate (qui est enti\u00e8rement suivi dans la branche de <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">d\u00e9veloppement<\/a> ), nous avons parcouru un long chemin en termes de refactorisation de son organisation.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e5eea22f.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-161272-61e71e5eea22f.png\" alt=\"Widgets WordPress : refactorisation, partie 3\"><\/a><\/p>\n<p>Jusqu&rsquo;\u00e0 pr\u00e9sent, nous avons\u00a0:<\/p>\n<ul>\n<li>examin\u00e9 comment <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-une-approche-orientee-objet\/\" title=\"l&#039;API WordPress Widget fournit un exemple\">l&rsquo;API WordPress Widget fournit un exemple<\/a> de programmation orient\u00e9e objet,<\/li>\n<li>comment nous pouvons utiliser cette API <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-detecter-la-programmation-orientee-objet\/\" title=\"pour d\u00e9terminer la programmation orient\u00e9e objet\">pour d\u00e9terminer la programmation orient\u00e9e objet<\/a> dans d&rsquo;autres domaines de WordPress,<\/li>\n<li>des outils install\u00e9s <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-commencer-par-les-normes\/\" title=\"pour nous aider \u00e0 \u00e9valuer la qualit\u00e9\">pour nous aider \u00e0 \u00e9valuer la qualit\u00e9<\/a> du code,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-refactorisation-partie-1\/\" title=\"trouv\u00e9 des erreurs qui existent actuellement dans le code\">trouv\u00e9 des erreurs qui existent actuellement dans le code<\/a> en termes de normes de programmation modernes,<\/li>\n<li>et a commenc\u00e9 \u00e0 r\u00e9organiser la base de code afin qu&rsquo;elle corresponde \u00e0 <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/widgets-wordpress-refactorisation-partie-2\/\" title=\"des pratiques plus modernes\">des pratiques plus modernes<\/a>.<\/li>\n<\/ul>\n<p>Nous sommes maintenant pr\u00eats \u00e0 commencer \u00e0 refactoriser ce code d&rsquo;une mani\u00e8re beaucoup plus orient\u00e9e objet.<\/p>\n<p>Donc, si vous n&rsquo;avez pas encore rattrap\u00e9 les messages pr\u00e9c\u00e9dents (aucun d&rsquo;entre eux, vraiment), je vous recommande de le faire car cela va prendre un peu de temps pour mettre cela \u00e0 jour. Il y a beaucoup de code pour \u00e9crire une explication.<\/p>\n<p>Commen\u00e7ons.<\/p>\n<h2>Le passe-partout du widget WordPress: refactorisation, partie 3<\/h2>\n<p>On peut dire que le plus gros probl\u00e8me avec le Boilerplate est que tout est encapsul\u00e9 dans une seule classe.<\/p>\n<p>Bien s\u00fbr, il y a quelques bonnes choses comme garder nos vues s\u00e9par\u00e9es de la logique c\u00f4t\u00e9 serveur, mais c&rsquo;est \u00e0 peu pr\u00e8s tout.<\/p>\n<p>D&rsquo;autres probl\u00e8mes qui existent juste en regardant le code incluent:<\/p>\n<ul>\n<li>ajouter des actions et des filtres dans le constructeur,<\/li>\n<li>avoir des m\u00e9thodes faisant plus d&rsquo;une chose,<\/li>\n<li>ne pas avoir de classes responsables de la mise en \u0153uvre de choses comme l&rsquo;enregistrement des d\u00e9pendances,<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p>Dans cet article, nous allons commencer le processus de cr\u00e9ation d&rsquo;abstractions que nous finirons par impl\u00e9menter pour briser la nature de classe divine du Boilerplate tel qu&rsquo;il est.<\/p>\n<p>Cela va \u00eatre divis\u00e9 en plusieurs messages afin que je sois en mesure de fournir une explication solide de la raison pour laquelle nous faisons certaines choses que nous faisons ainsi que d&rsquo;expliquer les exemples derri\u00e8re cela.<\/p>\n<p>Si je le fais autrement, la s\u00e9rie laisse de c\u00f4t\u00e9 trop d&rsquo;informations pr\u00e9cieuses applicables \u00e0 d&rsquo;autres pratiques de programmation orient\u00e9e objet.<\/p>\n<h3>Qu&rsquo;est-ce qu&rsquo;un abonn\u00e9\u00a0?<\/h3>\n<p>Le syst\u00e8me de crochet WordPress &#8211; c&rsquo;est-\u00e0-dire les actions et les filtres dont nous disposons &#8211; est bas\u00e9 sur un mod\u00e8le de conception pilot\u00e9 par les \u00e9v\u00e9nements. Cela signifie que chaque fois que quelque chose se produit, un \u00e9v\u00e9nement, WordPress d\u00e9clenchera tout autre code qui s&rsquo;est abonn\u00e9 audit \u00e9v\u00e9nement.<\/p>\n<p>Ainsi, lorsque nous enregistrons une fonction avec un crochet, nous nous <strong>abonnons<\/strong> \u00e0 l&rsquo; <strong>\u00e9v\u00e9nement<\/strong>. \u00c0 cette fin, je suis fan de la cr\u00e9ation d&rsquo;abonn\u00e9s pour n&rsquo;importe quel crochet dont nous aurons besoin.<\/p>\n<p>En plus de cela, les abonn\u00e9s suivent g\u00e9n\u00e9ralement un format coh\u00e9rent. Cela signifie qu&rsquo;il est vraiment facile de cr\u00e9er une classe abstraite qui impl\u00e9mente certaines des fonctionnalit\u00e9s coh\u00e9rentes, puis permet \u00e0 la classe impl\u00e9mentant la classe abstraite de se concentrer uniquement sur la logique m\u00e9tier.<\/p>\n<p>L&rsquo;un des moyens les plus simples de le d\u00e9montrer consiste \u00e0 s&rsquo;abonner aux fichiers CSS et aux fichiers JavaScript, car ce sont deux des \u00e9l\u00e9ments les plus courants que nous utilisons lors de la cr\u00e9ation de plugins.<\/p>\n<h3>Cr\u00e9ation d&rsquo;une classe abstraite<\/h3>\n<p>Avant d&rsquo;impl\u00e9menter la classe abstraite, exposons exactement ce que nous allons faire pour cr\u00e9er ceci.<\/p>\n<ol>\n<li>Nous avons besoin d&rsquo;une propri\u00e9t\u00e9 qui repr\u00e9sente l&rsquo;\u00e9v\u00e9nement auquel nous nous abonnons.<\/li>\n<li>Nous avons besoin d&rsquo;une fonction qui se d\u00e9clenche chaque fois que le hook est d\u00e9clench\u00e9 par WordPress. Une autre fa\u00e7on de penser \u00e0 cela est que nous avons besoin d&rsquo;une fonction \u00e0 impl\u00e9menter chaque fois qu&rsquo;une action ou un filtre donn\u00e9 est d\u00e9clench\u00e9 par WordPress.<\/li>\n<li>Nous avons besoin de classes pour impl\u00e9menter l&rsquo;abstraction.<\/li>\n<\/ol>\n<p>Commen\u00e7ons par d\u00e9finir les classes abstraites. <a href=\"https:\/\/secure.php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Directement du manuel PHP<\/a>, nous lisons :<\/p>\n<blockquote>\n<p>Les classes d\u00e9finies comme abstraites ne peuvent pas \u00eatre instanci\u00e9es et toute classe contenant au moins une m\u00e9thode abstraite doit \u00e9galement \u00eatre abstraite. Les m\u00e9thodes d\u00e9finies comme abstraites d\u00e9clarent simplement la signature de la m\u00e9thode &#8211; elles ne peuvent pas d\u00e9finir l&rsquo;impl\u00e9mentation.<\/p>\n<\/blockquote>\n<p>En bref, cela signifie que nous ne pouvons pas r\u00e9ellement cr\u00e9er une instance d&rsquo;une classe abstraite. Nous ne pouvons instancier que des classes qui d\u00e9finissent l&rsquo;impl\u00e9mentation.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e62f02d2.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-161272-61e71e62f02d2.png\" alt=\"Widgets WordPress : refactorisation, partie 3\"><\/a><\/p>\n<p>Cela ne signifie pas, cependant, que la classe abstraite ne peut pas impl\u00e9menter des choses concr\u00e8tes (comme la d\u00e9finition d&rsquo;un crochet). Mais cela signifie qu&rsquo;il existe certaines m\u00e9thodes qui n&rsquo;ont pas d&rsquo;impl\u00e9mentation.<\/p>\n<p>Sinon, il ne nous reste plus qu&rsquo;une classe de base.<\/p>\n<p>Avoir du sens\u00a0? Nous allons jeter un coup d&rsquo;oeil.<\/p>\n<h3>Cr\u00e9ation d&rsquo;une classe abstraite<\/h3>\n<p>Pour cet article, nous allons cr\u00e9er une classe abstraite sp\u00e9cifiquement pour les fichiers CSS et JavaScript.<\/p>\n<p>Rappelez-vous, comme il s&rsquo;agit d&rsquo;une classe abstraite, les abonn\u00e9s concrets peuvent \u00eatre appel\u00e9s quelque chose qui identifie ce qu&rsquo;ils font (c&rsquo;est-\u00e0-dire qu&rsquo;ils peuvent s&rsquo;appeler tout ce qui repr\u00e9sente leur objectif). Et nous allons arriver \u00e0 cela.<\/p>\n<p>Mais d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-00-abstract-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la classe abstraite.<\/a> Je vais partager le code puis expliquer exactement ce qui se passe avec:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * An abstract implementation of a subscriber that requires a hook and the ability to\n * start the class.\n *\/\nabstract class AbstractSubscriber\n{\n    \/**\n     * @var string a reference to the hook to which the subscriber should be registered\n     *\/\n    protected $hook;\n\n    \/**\n     * @param string $hook the hook to which the subscriber is registered\n     *\/\n    public function __construct(string $hook)\n    {\n        $this-&gt;hook = $hook;\n    }\n\n    \/**\n     * @return string the hook to which the subscriber is registered\n     *\/\n    public function getHook(): string\n    {\n        return $this-&gt;hook;\n    }\n\n    \/**\n     * Implements the domain logic for the concrete class implementating this subcriber.\n     *\/\n    abstract public function load();\n}\n<\/code><\/pre>\n<ol>\n<li>Notez que la propri\u00e9t\u00e9 que nous avons cr\u00e9\u00e9e est <strong>protected<\/strong>. C&rsquo;est ainsi que les classes d&rsquo;impl\u00e9mentation peuvent y acc\u00e9der, mais que tout ce qui se trouve en dehors ne le peut pas.<\/li>\n<li>J&rsquo;ai cr\u00e9\u00e9 une fonction pour r\u00e9cup\u00e9rer le crochet qui deviendra apparent plus tard. En r\u00e8gle g\u00e9n\u00e9rale, je d\u00e9teste impl\u00e9menter des fonctionnalit\u00e9s qui ne sont pas imm\u00e9diatement \u00e9videntes, mais c&rsquo;est quelque chose d&rsquo;important compte tenu de la direction que nous prenons.<\/li>\n<li>Il existe une fonction abstraite appel\u00e9e <strong>load<\/strong>. C&rsquo;est l\u00e0 que toute classe qui impl\u00e9mente cette fonction h\u00e9bergera sa logique m\u00e9tier, comme nous le verrons dans un instant.<\/li>\n<li>J&rsquo;aime documenter le but des fonctions lorsque cela est n\u00e9cessaire afin qu&rsquo;elles soient au m\u00eame endroit, puis laisser les classes d&rsquo;impl\u00e9mentation fournir la documentation dont elles ont besoin pour leur impl\u00e9mentation. Vous le verrez momentan\u00e9ment aussi.<\/li>\n<\/ol>\n<p>Maintenant que nous avons la classe abstraite en place, la derni\u00e8re chose que nous devons faire est de nous assurer qu&rsquo;elle est plac\u00e9e dans le bon r\u00e9pertoire et dans l&rsquo;espace de noms. Si vous avez suivi le post pr\u00e9c\u00e9dent, vous avez probablement pu deviner o\u00f9 il va r\u00e9sider en fonction de l&rsquo;espace de noms dans le code.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161272-61e71e66e7d4a.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-161272-61e71e66e7d4a.png\" alt=\"Widgets WordPress : refactorisation, partie 3\"><\/a><\/p>\n<p>Et sinon, pas de soucis. Comprendre les espaces de noms et autres peut prendre un peu de temps. Donc, \u00e0 travers ces messages d&rsquo;adh\u00e9sion et ces exemples, j&rsquo;esp\u00e8re que cela deviendra clair avec le temps.<\/p>\n<h3>Cr\u00e9ation de classes concr\u00e8tes<\/h3>\n<p>Impl\u00e9mentons maintenant cette classe particuli\u00e8re pour ajouter \u00e0 la fois les feuilles de style et les sources JavaScript dont nous disposons. Ce que vous allez remarquer, cependant, c&rsquo;est qu&rsquo;ils sont tr\u00e8s similaires.<\/p>\n<p>La seule chose qui diff\u00e8re est la mise en \u0153uvre de la fonctionnalit\u00e9 de <strong>chargement<\/strong>, qui correspond exactement \u00e0 la mani\u00e8re dont cela devrait fonctionner.<\/p>\n<h5>Feuilles de style<\/h5>\n<p>\u00c9tant donn\u00e9 la classe abstraite ci-dessus, nous devons maintenant cr\u00e9er une classe pour enregistrer les feuilles de style. Puisque nous avons deux feuilles de style, nous allons cr\u00e9er deux classes :<\/p>\n<ol>\n<li>la premi\u00e8re classe sera charg\u00e9e d&rsquo;enregistrer la feuille de style pour le tableau de bord et sp\u00e9cifiquement pour la page du widget WordPress,<\/li>\n<li>la deuxi\u00e8me classe sera responsable de l&rsquo;enregistrement du plugin pour le blog r\u00e9el.<\/li>\n<\/ol>\n<p>Appelons chacun de ces <strong>AdminStylesheetSubscriber<\/strong> et <strong>PublicStylesheetSubscriber<\/strong> respectivement.<\/p>\n<p>Tout d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-03-admin-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;abonn\u00e9 de la feuille de style admin<\/a>\u00a0:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com?\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the Widget administration page.\n *\/\nclass AdminStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative stylesheet to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/admin.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Notez que cela utilise la fonction <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/get_current_screen\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_current_screen()<\/a> que j&rsquo;ai utilis\u00e9e dans les articles pr\u00e9c\u00e9dents pour m&rsquo;assurer que nous ajoutons des d\u00e9pendances uniquement lorsque cela est n\u00e9cessaire.<\/p>\n<p>Maintenant, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-05-public-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;abonn\u00e9 JavaScript public<\/a>. Cela utilise la fonction <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_admin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">is_admin()<\/a> pour s&rsquo;assurer que nous ne sommes pas dans la zone administrative de WordPress.<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the stylesheet on the blog.\n *\/\nclass PublicStyleAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the stylesheet to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_style(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/css\/widget.css'\n        );\n    }\n}\n<\/code><\/pre>\n<p>\u00c9videmment, nous n&rsquo;avons pas encore r\u00e9ellement instanci\u00e9 ces classes. Cela viendra plus tard dans la s\u00e9rie.<\/p>\n<h5>Javascript<\/h5>\n<p>Les abonn\u00e9s JavaScript ne sont pas tr\u00e8s diff\u00e9rents, comme vous l&rsquo;avez peut-\u00eatre devin\u00e9. Nous les s\u00e9parerons en fonction du domaine de l&rsquo;application dans lequel ils se concentrent et nous les nommerons de mani\u00e8re appropri\u00e9e.<\/p>\n<p>Tout d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-02-admin-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;abonn\u00e9 JavaScript admin<\/a>\u00a0:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the Widget's adminsitration page.\n *\/\nclass AdminScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the administrative JavaScript to the widget administration page.\n     *\/\n    public function load()\n    {\n        if ('widgets' !== get_current_screen()-&gt;id) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/admin.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Et <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-04-public-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;abonn\u00e9 JavaScript public\u00a0:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateSubscriber;\n\n\/**\n * The subscriber responsible for loading the JavaScript on the blog.\n *\/\nclass PublicScriptAssetSubscriber extends AbstractSubscriber\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    \/**\n     * Adds the JavaScript to the public-facing side of the site.\n     *\/\n    public function load()\n    {\n        if (is_admin()) {\n            return;\n        }\n\n        wp_enqueue_script(\n            'wordpress-widget-boilerplate',\n            plugin_dir_url(dirname(__DIR__)).'assets\/js\/widget.js'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Encore une fois, ces classes ne peuvent pas encore \u00eatre instanci\u00e9es, mais nous nous concentrerons l\u00e0-dessus dans un prochain article.<\/p>\n<h2>Abstractions et interfaces<\/h2>\n<p>N&rsquo;oubliez pas que les abstractions et les interfaces sont diff\u00e9rentes mais se confondent facilement. Les interfaces ne contiennent absolument aucune impl\u00e9mentation. Au lieu de cela, ils fournissent une garantie que toute classe qui impl\u00e9mente l&rsquo;interface impl\u00e9mentera toutes les m\u00e9thodes.<\/p>\n<p>Les classes abstraites, d&rsquo;autre part, peuvent avoir certaines fonctionnalit\u00e9s impl\u00e9ment\u00e9es dans la classe abstraite tout en laissant le code sp\u00e9cifique au domaine &#8211; comme le chargement des feuilles de style et JavaScript &#8211; \u00e0 la m\u00e9thode appropri\u00e9e.<\/p>\n<p>Cela deviendra \u00e9vident, si ce n&rsquo;est d\u00e9j\u00e0 fait, au fur et \u00e0 mesure que nous avancerons dans cette s\u00e9rie. En attendant \u2013 et comme d&rsquo;habitude \u2013 n&rsquo;oubliez pas de consulter la branche <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">develop<\/a> pour voir o\u00f9 nous en sommes avec le code.<\/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>On peut dire que le plus gros probl\u00e8me avec le Boilerplate est que tout est encapsul\u00e9 dans une seule classe. Alors changeons cela avec des classes abstraites.<\/p>\n","protected":false},"author":1,"featured_media":235804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717,832,801,862],"tags":[1167],"class_list":["post-231179","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","category-guide-pour-les-debutants","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231179","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=231179"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231179\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/235804"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}