{"id":231283,"date":"2022-12-17T14:57:00","date_gmt":"2022-12-17T11:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231283"},"modified":"2022-12-17T14:59:03","modified_gmt":"2022-12-17T11:59:03","slug":"wordpress-widgetit-refaktorointi-osa-3","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-refaktorointi-osa-3\/","title":{"rendered":"WordPress-widgetit: Refaktorointi, osa 3"},"content":{"rendered":"\n<p>WordPress Widget Boilerplaten (joita kaikkia seurataan kehityshaarassa) p\u00e4ivitt\u00e4misess\u00e4 <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">olemme<\/a> p\u00e4\u00e4sseet pitk\u00e4lle sen j\u00e4rjestelyn uudistamisessa.<\/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=\"WordPress-widgetit: Refaktorointi, osa 3\"><\/a><\/p>\n<p>T\u00e4h\u00e4n menness\u00e4 olemme:<\/p>\n<ul>\n<li>katsoi, kuinka <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-oliolaehtoeinen-laehestymistapa\/\" title=\"WordPress Widget API tarjoaa esimerkin\">WordPress Widget API tarjoaa esimerkin<\/a> olio-ohjelmoinnista,<\/li>\n<li>kuinka voimme k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 API <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-tunnista-olio-ohjelmointi\/\" title=\":ta m\u00e4\u00e4ritt\u00e4m\u00e4\u00e4n olio-ohjelmointia\">:ta m\u00e4\u00e4ritt\u00e4m\u00e4\u00e4n olio-ohjelmointia<\/a> muilla WordPressin alueilla,<\/li>\n<li>asennetut <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-standardeista-alkaen\/\" title=\"ty\u00f6kalut, jotka auttavat meit\u00e4 arvioimaan\">ty\u00f6kalut, jotka auttavat meit\u00e4 arvioimaan<\/a> koodin laatua,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-refaktorointi-osa-1\/\" title=\"havaitsi virheit\u00e4, joita koodissa on t\u00e4ll\u00e4 hetkell\u00e4\">havaitsi virheit\u00e4, joita koodissa on t\u00e4ll\u00e4 hetkell\u00e4<\/a> nykyaikaisten ohjelmointistandardien mukaan,<\/li>\n<li>ja aloitti koodikannan uudelleenj\u00e4rjestelyn, jotta se sopisi <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-refaktorointi-osa-2\/\" title=\"nykyaikaisempien k\u00e4yt\u00e4nt\u00f6jen\">nykyaikaisempien k\u00e4yt\u00e4nt\u00f6jen<\/a> kanssa .<\/li>\n<\/ul>\n<p>Nyt olemme valmiita aloittamaan t\u00e4m\u00e4n koodin uudelleenmuodostamisen paljon oliokeskeisemm\u00e4ll\u00e4 tavalla.<\/p>\n<p>Joten jos et ole viel\u00e4 perehtynyt aikaisempiin viesteihin (todella kaikkiin niist\u00e4), suosittelen tekem\u00e4\u00e4n niin, koska t\u00e4m\u00e4n p\u00e4ivitt\u00e4minen kest\u00e4\u00e4 hetken. On paljon koodia selityksen kirjoittamiseen.<\/p>\n<p>Aloitetaan.<\/p>\n<h2>WordPress Widget Boilerplate: Refactoring, osa 3<\/h2>\n<p>Luultavasti Boilerplaten suurin ongelma on, ett\u00e4 kaikki on kapseloitu yhteen luokkaan.<\/p>\n<p>Toki, on joitain mukavia asioita, kuten pit\u00e4\u00e4 n\u00e4kemyksemme erill\u00e4\u00e4n palvelinpuolen logiikasta, mutta se on noin pitk\u00e4lle menev\u00e4.<\/p>\n<p>Muita ongelmia, joita ilmenee vain koodin katsomisesta, ovat:<\/p>\n<ul>\n<li>lis\u00e4\u00e4m\u00e4ll\u00e4 toimintoja ja suodattimia rakentajaan,<\/li>\n<li>jolla on menetelmi\u00e4 useamman kuin yhden asian tekemiseen,<\/li>\n<li>joilla ei ole luokkia, jotka ovat vastuussa asioiden, kuten riippuvuuksien rekister\u00f6innin, toteuttamisesta,<\/li>\n<li>ja niin edelleen.<\/li>\n<\/ul>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 aiomme aloittaa prosessin luoda abstraktioita, joita otamme lopulta k\u00e4ytt\u00f6\u00f6n hajottaaksemme Boilerplaten jumalallisen luonteen sellaisenaan.<\/p>\n<p>T\u00e4m\u00e4 jaetaan useisiin viesteihin, jotta voin antaa vankan selityksen sille, miksi teemme tiettyj\u00e4 asioita, joita teemme, sek\u00e4 selitt\u00e4\u00e4 esimerkkej\u00e4 niiden takana.<\/p>\n<p>Jos teen sen jollain muulla tavalla, sarja j\u00e4tt\u00e4\u00e4 liian paljon arvokasta tietoa, jota voidaan soveltaa muihin olio-ohjelmointik\u00e4yt\u00e4nt\u00f6ihin.<\/p>\n<h3>Mik\u00e4 on tilaaja?<\/h3>\n<p>WordPress hook -j\u00e4rjestelm\u00e4 \u2013 eli k\u00e4yt\u00f6ss\u00e4mme olevat toiminnot ja suodattimet \u2013 perustuvat tapahtumal\u00e4ht\u00f6iseen suunnittelumalliin. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 aina kun jotain tapahtuu, tapahtuma, WordPress k\u00e4ynnist\u00e4\u00e4 mink\u00e4 tahansa muun koodin, joka on tilannut mainitun tapahtuman.<\/p>\n<p>Joten kun rekister\u00f6imme toiminnon koukulla<strong>,<\/strong> <strong>tilaamme<\/strong> tapahtuman. T\u00e4t\u00e4 tarkoitusta varten pid\u00e4n tilaajien luomisesta mille tahansa tarvitsemamme koukkuun.<\/p>\n<p>T\u00e4m\u00e4n lis\u00e4ksi tilaajat noudattavat yleens\u00e4 yhten\u00e4ist\u00e4 muotoa. T\u00e4m\u00e4 tarkoittaa, ett\u00e4 on todella helppoa luoda abstrakti luokka, joka toteuttaa osan johdonmukaisista toiminnoista ja antaa sitten abstraktin luokan toteuttavan luokan keskitty\u00e4 yksinomaan liiketoimintalogiikkaan.<\/p>\n<p>Yksi helpoimmista tavoista osoittaa t\u00e4m\u00e4 on CSS-tiedostojen ja JavaScript-tiedostojen tilaaja, koska ne ovat kaksi yleisint\u00e4 asiaa, joita k\u00e4yt\u00e4mme lis\u00e4osien rakentamisessa.<\/p>\n<h3>Abstraktiluokan luominen<\/h3>\n<p>Ennen kuin otamme k\u00e4ytt\u00f6\u00f6n abstraktin luokan, kerrotaan tarkalleen, mit\u00e4 aiomme tehd\u00e4 luodaksemme t\u00e4m\u00e4n.<\/p>\n<ol>\n<li>Tarvitsemme sivuston, joka edustaa tilaamaamme tapahtumaa.<\/li>\n<li>Tarvitsemme toiminnon, joka laukeaa aina, kun WordPress laukaisee koukun. Toinen tapa ajatella t\u00e4t\u00e4 on, ett\u00e4 tarvitsemme toiminnon, joka toteutetaan aina, kun WordPress k\u00e4ynnist\u00e4\u00e4 tietyn toiminnon tai suodattimen.<\/li>\n<li>Tarvitsemme luokkia abstraktion toteuttamiseksi.<\/li>\n<\/ol>\n<p>Ensin m\u00e4\u00e4ritell\u00e4\u00e4n abstraktit luokat. <a href=\"https:\/\/secure.php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Suoraan PHP-oppaasta<\/a> luemme:<\/p>\n<blockquote>\n<p>Abstrakteiksi m\u00e4\u00e4riteltyj\u00e4 luokkia ei saa ilment\u00e4\u00e4, ja jokaisen luokan, joka sis\u00e4lt\u00e4\u00e4 v\u00e4hint\u00e4\u00e4n yhden abstraktin menetelm\u00e4n, on my\u00f6s oltava abstrakti. Abstrakteiksi m\u00e4\u00e4ritellyt menetelm\u00e4t yksinkertaisesti ilmoittavat menetelm\u00e4n allekirjoituksen \u2013 ne eiv\u00e4t voi m\u00e4\u00e4ritell\u00e4 toteutusta.<\/p>\n<\/blockquote>\n<p>Lyhyesti sanottuna t\u00e4m\u00e4 tarkoittaa, ett\u00e4 emme voi itse asiassa luoda abstraktin luokan esiintym\u00e4\u00e4. Voimme ilment\u00e4\u00e4 vain luokkia, jotka m\u00e4\u00e4rittelev\u00e4t toteutuksen.<\/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=\"WordPress-widgetit: Refaktorointi, osa 3\"><\/a><\/p>\n<p>T\u00e4m\u00e4 ei kuitenkaan tarkoita, etteik\u00f6 abstrakti luokka voisi toteuttaa konkreettisia asioita (kuten koukun m\u00e4\u00e4ritelm\u00e4\u00e4). Mutta se tarkoittaa, ett\u00e4 on tiettyj\u00e4 menetelmi\u00e4, joilla ei ole toteutusta.<\/p>\n<p>Muuten j\u00e4\u00e4mme vain perusluokkaan.<\/p>\n<p>K\u00e4yd\u00e4 j\u00e4rkeen? Katsotaanpa.<\/p>\n<h3>Abstraktiluokan luominen<\/h3>\n<p>T\u00e4t\u00e4 viesti\u00e4 varten aiomme luoda abstraktin luokan erityisesti CSS-tiedostoille ja JavaScriptille.<\/p>\n<p>Muista, koska t\u00e4m\u00e4 on abstrakti luokka, konkreettisia tilaajia voidaan kutsua joksikin, joka tunnistaa heid\u00e4n tekemisens\u00e4 (eli he voivat kutsua itse\u00e4\u00e4n mille tahansa, mik\u00e4 edustaa heid\u00e4n tarkoitustaan). Ja siihen p\u00e4\u00e4st\u00e4\u00e4n.<\/p>\n<p>Mutta ensin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-00-abstract-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">abstrakti luokka.<\/a> Jaan koodin ja selit\u00e4n tarkalleen, mit\u00e4 sille tapahtuu:<\/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>Huomaa, ett\u00e4 luomamme omaisuus on <strong>suojattu<\/strong>. T\u00e4m\u00e4 on niin, ett\u00e4 toteuttavat luokat voivat k\u00e4ytt\u00e4\u00e4 sit\u00e4, mutta mik\u00e4\u00e4n sen ulkopuolella ei voi.<\/li>\n<li>Olen luonut toiminnon koukun hakemiseen, joka tulee ilmi my\u00f6hemmin. Tyypillisesti vihaan sellaisten toimintojen k\u00e4ytt\u00f6\u00f6nottoa, jotka eiv\u00e4t ole heti ilmeisi\u00e4, mutta t\u00e4m\u00e4 on t\u00e4rke\u00e4 asia, kun otetaan huomioon, mihin olemme menossa.<\/li>\n<li>On abstrakti funktio nimelt\u00e4 <strong>load<\/strong>. T\u00e4ss\u00e4 on jokainen luokka, joka toteuttaa t\u00e4m\u00e4n toiminnon, sis\u00e4lt\u00e4\u00e4 liiketoimintalogiikkansa, kuten n\u00e4emme hetken kuluttua.<\/li>\n<li>Haluan dokumentoida funktioiden tarkoituksen tarvittaessa niin, ett\u00e4 ne ovat yhdess\u00e4 paikassa ja sitten annan toteutusluokkien toimittaa dokumentaation, jonka ne tarvitsevat toteutuksessaan. N\u00e4et t\u00e4m\u00e4nkin hetken.<\/li>\n<\/ol>\n<p>Nyt kun meill\u00e4 on abstrakti luokka paikallaan, viimeinen asia, joka meid\u00e4n on teht\u00e4v\u00e4, on varmistaa, ett\u00e4 se on sijoitettu oikeaan hakemistoon ja nimiavaruuteen. Jos olet seurannut edellisest\u00e4 viestist\u00e4 alkaen, olet todenn\u00e4k\u00f6isesti voinut arvata, miss\u00e4 se tulee olemaan koodin nimitilan perusteella.<\/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=\"WordPress-widgetit: Refaktorointi, osa 3\"><\/a><\/p>\n<p>Ja jos ei, ei h\u00e4t\u00e4\u00e4. Nimiavaruuksien ja muiden asioiden selvitt\u00e4minen voi vied\u00e4 v\u00e4h\u00e4n aikaa. Joten n\u00e4iden j\u00e4senviestien ja n\u00e4iden esimerkkien kautta toivon, ett\u00e4 se tulee selv\u00e4ksi ajan my\u00f6t\u00e4.<\/p>\n<h3>Konkreettisten luokkien luominen<\/h3>\n<p>Toteutetaan nyt t\u00e4m\u00e4 tietty luokka lis\u00e4t\u00e4ksemme sek\u00e4 tyylisivut ett\u00e4 JavaScript-l\u00e4hteet. Huomaat kuitenkin, ett\u00e4 ne ovat hyvin samankaltaisia.<\/p>\n<p>Ainoa asia, joka eroaa, on lataustoiminnon toteutus, <strong>jonka<\/strong> pit\u00e4isi toimia juuri n\u00e4in.<\/p>\n<h5>Tyylitaulukot<\/h5>\n<p>Kun otetaan huomioon yll\u00e4 oleva abstrakti luokka, meid\u00e4n on nyt luotava luokka tyylitaulukoiden rekister\u00f6inti\u00e4 varten. Koska meill\u00e4 on kaksi tyylitaulukkoa, luomme kaksi luokkaa:<\/p>\n<ol>\n<li>ensimm\u00e4inen luokka vastaa tyylitaulukon rekister\u00f6innist\u00e4 kojelautaan ja erityisesti WordPress-widgetin sivulle,<\/li>\n<li>toinen luokka on vastuussa laajennuksen rekister\u00f6imisest\u00e4 varsinaiseen blogiin.<\/li>\n<\/ol>\n<p>Kutsutaan kutakin n\u00e4ist\u00e4 <strong>AdminStylesheetSubscriber<\/strong> ja <strong>PublicStylesheetSubscriber<\/strong>.<\/p>\n<p>Ensinn\u00e4kin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-03-admin-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rjestelm\u00e4nvalvojan tyylitaulukon tilaaja<\/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?\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>Huomaa, ett\u00e4 t\u00e4m\u00e4 k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/get_current_screen\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_current_screen()-<\/a> funktiota, jota olen k\u00e4ytt\u00e4nyt aiemmissa viesteiss\u00e4 varmistaakseen, ett\u00e4 lis\u00e4\u00e4mme riippuvuuksia vain tarvittaessa.<\/p>\n<p>Nyt <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-05-public-style-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">julkinen JavaScript-tilaaja<\/a>. T\u00e4m\u00e4 k\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_admin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">is_admin()<\/a> -funktiota varmistaakseen, ett\u00e4 emme ole WordPressin hallintoalueella.<\/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>On selv\u00e4\u00e4, ett\u00e4 emme ole viel\u00e4 luoneet n\u00e4it\u00e4 luokkia. Se tulee my\u00f6hemmin sarjassa.<\/p>\n<h5>JavaScript<\/h5>\n<p>JavaScript-tilaajat eiv\u00e4t ole paljon erilaisia, kuten olet ehk\u00e4 arvannut. Erottelemme ne sovelluksen alueen perusteella, johon ne keskittyv\u00e4t, ja nime\u00e4mme ne asianmukaisesti.<\/p>\n<p>Ensinn\u00e4kin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-02-admin-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rjestelm\u00e4nvalvojan JavaScript-tilaaja<\/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 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>Ja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9cf10f4aadbe54f2fc2e87b619a33bcc#file-04-public-script-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">julkinen JavaScript-tilaaja:<\/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>J\u00e4lleen kerran, n\u00e4it\u00e4 luokkia ei voida viel\u00e4 instantoida, mutta keskitymme siihen tulevassa postauksessa.<\/p>\n<h2>Abstraktiot ja rajapinnat<\/h2>\n<p>Muista, ett\u00e4 abstraktiot ja k\u00e4ytt\u00f6liittym\u00e4t ovat erilaisia, mutta ne sekoittuvat helposti. Liit\u00e4nn\u00e4t eiv\u00e4t sis\u00e4ll\u00e4 lainkaan toteutusta. Sen sijaan ne takaavat, ett\u00e4 mik\u00e4 tahansa luokka, joka toteuttaa rajapinnan, toteuttaa kaikki menetelm\u00e4t.<\/p>\n<p>Abstrakteilla luokilla sen sijaan voidaan toteuttaa joitain toimintoja abstraktissa luokassa j\u00e4tt\u00e4en toimialuekohtaisen koodin \u2013 kuten tyylisivujen ja JavaScriptin lataamisen \u2013 sopivalle menetelm\u00e4lle.<\/p>\n<p>T\u00e4m\u00e4 tulee ilmeiseksi, jos se ei ole jo k\u00e4ynyt ilmi, mit\u00e4 pidemm\u00e4lle p\u00e4\u00e4semme t\u00e4h\u00e4n sarjaan. Sill\u00e4 v\u00e4lin \u2013 ja tuttuun tapaan \u2013 \u00e4l\u00e4 unohda tarkistaa <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kehityshaaraa<\/a> n\u00e4hd\u00e4ksesi miss\u00e4 olemme koodin kanssa.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Luultavasti Boilerplaten suurin ongelma on, ett\u00e4 kaikki on kapseloitu yhteen luokkaan. Muutetaan se siis abstrakteilla luokilla.<\/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":[719,834,803,864],"tags":[1166],"class_list":["post-231283","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-opas-aloittelijoille","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=231283"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231283\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/235804"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}