{"id":231347,"date":"2022-12-14T14:29:00","date_gmt":"2022-12-14T11:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231347"},"modified":"2022-12-14T14:31:32","modified_gmt":"2022-12-14T11:31:32","slug":"widget-wordpress-rileva-la-programmazione-orientata-agli-oggetti","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-rileva-la-programmazione-orientata-agli-oggetti\/","title":{"rendered":"Widget WordPress: rileva la programmazione orientata agli oggetti"},"content":{"rendered":"\n<p>Se non hai letto il primo post di questa serie, te lo consiglio, poich\u00e9 stiamo iniziando a scrivere codice orientato agli oggetti per WordPress attraverso l&#8217;uso <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dell&#8217;API Widgets.<\/a><\/strong><\/p>\n<p>La serie catturer\u00e0 alcune cose:<\/p>\n<ol>\n<li>mostrarti lo scheletro di base di un widget e perch\u00e9 \u00e8 orientato agli oggetti,<\/li>\n<li>discuti quali cose dovresti essere in grado di notare e perch\u00e9<\/li>\n<li>prima aggiorna il Widget Boilerplate direttamente su questo sito e poi invialo a GitHub,<\/li>\n<li>costruire un widget utilizzando l&#8217;API con il boilerplate come base per il nostro lavoro.<\/li>\n<\/ol>\n<p>Ma prima di farlo, voglio assicurarmi che tutti coloro che leggono questo articolo siano coinvolti nei principi fondamentali della programmazione orientata agli oggetti e abbiano tutto il necessario per costruire una soluzione orientata agli oggetti per WordPress.<\/p>\n<p>A tal fine, ti consiglio quanto segue:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"Due pilastri della programmazione orientata agli oggetti: parte 1 di 2\">Due pilastri della programmazione orientata agli oggetti: parte 1 di 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-secondi-due-pilastri-delloop\/\" title=\"Due pilastri della programmazione orientata agli oggetti: parte 2 di 2\">Due pilastri della programmazione orientata agli oggetti: parte 2 di 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/classi-astratte-parte-1-comportamento-astratto\/\" title=\"Classi astratte, parte 1 \u2013 Comportamento astratto\">Classi astratte, parte 1 \u2013 Comportamento astratto<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/classi-astratte-parte-2-classi-astratte-e-interfacce\/\" title=\"Classi astratte, parte 2 \u2013 Classi astratte e interfacce\">Classi astratte, parte 2 \u2013 Classi astratte e interfacce<\/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\">Lo sviluppatore indipendente di WordPress<\/a><\/strong><\/li>\n<\/ol>\n<p>Se hai letto tutto questo contenuto, fantastico. Sarai ben preparato per questo post e per i prossimi post. In caso contrario, potrebbero esserci dei buchi nel resto di ci\u00f2 che stai per leggere, ma il succo del post dovrebbe essere abbastanza chiaro.<\/p>\n<h3>Qual \u00e8 il problema, esattamente?<\/h3>\n<p>Ecco il punto: la <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-un-approccio-orientato-agli-oggetti\/\" title=\"scorsa settimana\">scorsa settimana<\/a><\/strong> ho condiviso un po&#8217; di codice insieme ad alcune informazioni sull&#8217;API dei <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">widget<\/a><\/strong>. Lo rivisiter\u00f2 un po&#8217; di pi\u00f9 in questo post prima di entrare nella parte pi\u00f9 intensiva del codice per due motivi:<\/p>\n<ol>\n<li>Voglio che tutti coloro che leggono questo articolo siano sulla stessa pagina per quanto riguarda la scrittura di codice orientato agli oggetti (almeno, in questo contesto),<\/li>\n<li>Riconosco che le persone provengono da background diversi e voglio assicurarmi che siamo tutti sulla stessa pagina il pi\u00f9 possibile prima di procedere.<\/li>\n<\/ol>\n<p>Se hai esperienza con la scrittura di codice orientato agli oggetti, specialmente in una capacit\u00e0 avanzata, questo potrebbe sembrarti pi\u00f9 semplice; in caso contrario, spero che questo ti fornisca tutto ci\u00f2 di cui hai bisogno per rilevare le pratiche orientate agli oggetti non solo riguardo a questa API ma anche durante la lettura del codice degli altri.<\/p>\n<h2>Come rilevare la programmazione orientata agli oggetti<\/h2>\n<p>Forse una prima domanda naturale \u00e8 perch\u00e9 dobbiamo essere in grado di rilevare, leggere o comprendere la programmazione orientata agli oggetti prima di scriverla effettivamente?<\/p>\n<h3>Una parola sul codice errato<\/h3>\n<p>La risposta breve \u00e8 questa:<\/p>\n<p>Non \u00e8 necessario, ma \u00e8 utile. Se sei in grado di leggere la programmazione orientata agli oggetti, avrai un vantaggio nell&#8217;trarre vantaggio da ci\u00f2 che offre come paradigma perch\u00e9 svilupperai sulle strategie e sul lavoro svolto da altri in altri progetti.<\/p>\n<p>Ci\u00f2 non significa che non leggeremo il codice errato, ma faremo il possibile per identificare il codice errato, identificare le aree problematiche e quindi fare il possibile per evitare di incorporarlo nel nostro lavoro.<\/p>\n<p>Per ora, per\u00f2, diamo un&#8217;occhiata <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">all&#8217;API Widgets<\/a><\/strong> per vedere cosa possiamo fare per rilevare la programmazione orientata agli oggetti.<\/p>\n<h3>Torna alla programmazione orientata agli oggetti<\/h3>\n<p>Nel post precedente, ho delineato due cose che indicano che l&#8217;API \u00e8 orientata agli oggetti (almeno in una certa misura):<\/p>\n<ol>\n<li>l&#8217;uso della parola chiave <strong>extends<\/strong> ,<\/li>\n<li>funzioni che dobbiamo implementare.<\/li>\n<\/ol>\n<p>Il motivo per cui voglio rivisitare questo argomento \u00e8 che identifica due cose chiave che fanno parte dei principi fondamentali orientati agli oggetti: l&#8217; <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ereditariet\u00e0<\/a><\/strong> e l&#8217;implementazione delle funzioni (che spesso fa parte delle <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">classi astratte<\/a><\/strong> ).<\/p>\n<p>Una nota prima di guardare quanto sopra:<\/p>\n<p>Quando guardi <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il sorgente della classe WP_Widget<\/a><\/strong>, noterai che non ci sono metodi astratti. Ma alcune delle funzioni che dobbiamo implementare, che menzioner\u00f2 pi\u00f9 avanti in questo post, sono i primi candidati per i metodi astratti. E parler\u00f2 anche del perch\u00e9.<\/p>\n<p>Separiamo gli argomenti sopra in due sezioni separate: Ereditariet\u00e0 e Astrazioni.<\/p>\n<h3>Eredit\u00e0<\/h3>\n<p>Ho trattato l&#8217;ereditariet\u00e0 \u00e8 <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-un-approccio-orientato-agli-oggetti\/\" title=\"la profondit\u00e0 relativa nel post precedente\">la profondit\u00e0 relativa nel post precedente<\/a><\/strong>, quindi non mi soffermer\u00f2 sul punto qui. Offrir\u00f2 alcune parole, ma sono molto pi\u00f9 interessato a discutere dell&#8217;astrazione, cosa che far\u00f2 tra un momento.<\/p>\n<p>Prima di entrare troppo in questo, per\u00f2, fare riferimento al <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seguente codice:<\/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>Ma prima, possiamo riconoscere che qualsiasi classe che implementa l&#8217;API Widgets deve utilizzare l&#8217;ereditariet\u00e0 semplicemente a causa della parola chiave <strong>extends<\/strong>.<\/p>\n<p>Ci\u00f2 significa che c&#8217;\u00e8 un livello di funzionalit\u00e0 che erediteremo (o che otterremo gratuitamente) e c&#8217;\u00e8 un livello di funzionalit\u00e0 che dobbiamo implementare da soli.<\/p>\n<p>Dal <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">manuale PHP<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Ad esempio, quando si estende una classe, la sottoclasse eredita tutti i metodi pubblici e protetti dalla classe padre. A meno che una classe non sostituisca questi metodi, manterranno la loro funzionalit\u00e0 originale.<\/p>\n<\/blockquote>\n<p>Quando erediti la funzionalit\u00e0 da una classe, tuttavia, potresti scoprire che \u00e8 importante chiamare rigorosamente il costruttore del genitore (nella nostra funzione <strong>__construct<\/strong> ).<\/p>\n<p>Ma questo solleva quello che ritengo essere uno dei problemi pi\u00f9 importanti con l&#8217;ereditariet\u00e0 in PHP (e l&#8217;intero motivo per cui volevo includere questa sezione): dobbiamo chiamare esplicitamente il costruttore genitore?<\/p>\n<p>Anche secondo <strong><a href=\"http:\/\/www.php.net\/manual\/en\/language.oop5.decon.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il manuale:<\/a><\/strong><\/p>\n<blockquote>\n<p>I costruttori padre non vengono chiamati in modo implicito se la classe figlio definisce un costruttore. Per eseguire un costruttore padre, \u00e8 richiesta una chiamata a <strong>parent::__construct()<\/strong> all&#8217;interno del costruttore figlio. Se il figlio non definisce un costruttore, pu\u00f2 essere ereditato dalla classe genitore proprio come un normale metodo di classe (se non \u00e8 stato dichiarato privato).<\/p>\n<\/blockquote>\n<p>Ma possiamo semplificare questo. Forse questo \u00e8 pi\u00f9 facile da ricordare:<\/p>\n<ol>\n<li>Se la nostra classe usa l&#8217;ereditariet\u00e0 ma non definisce un costruttore, viene chiamato il costruttore genitore.<\/li>\n<li>Se la nostra classe usa l&#8217;ereditariet\u00e0 ma definisce un costruttore, il costrutto genitore deve essere chiamato esplicitamente.<\/li>\n<\/ol>\n<p>O forse anche pi\u00f9 semplicemente:<\/p>\n<ul>\n<li>Se la nostra classe non definisce un costruttore, il codice verr\u00e0 impostato automaticamente sul costruttore dei genitori.<\/li>\n<\/ul>\n<p>Ha senso? In breve, se definiamo le nostre propriet\u00e0, l&#8217;inizializzazione e il codice in un costruttore, la prima riga del costruttore della nostra classe dovrebbe essere una chiamata al costruttore genitore.<\/p>\n<h3>Astrazione<\/h3>\n<p>Per essere assolutamente chiari, il codice sorgente della classe <strong>WP_Widget<\/strong> non include metodi astratti. Parte di questo ha a che fare con il modo in cui \u00e8 costruita la classe, parte di questo ha a che fare con la compatibilit\u00e0 con le versioni precedenti e le funzionalit\u00e0 di PHP5.<\/p>\n<p>Ci\u00f2 non significa che non possiamo identificare quali funzioni potrebbero essere contrassegnate come <strong>abstract<\/strong>, per\u00f2. In effetti, penso che sia un caso su quali classi dovrebbero essere rese astratte. Ma prima, definiamo le funzioni astratte.<\/p>\n<p><strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dal manuale<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Quando si eredita da una classe astratta, tutti i metodi contrassegnati come astratti nella dichiarazione di classe del genitore devono essere definiti dal figlio; inoltre, tali modalit\u00e0 devono essere definite con la stessa (o meno ristretta) visibilit\u00e0.<\/p>\n<\/blockquote>\n<p>Osservando la fonte del nostro widget:<\/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>Penso che sia giusto dire che la funzione <strong>form<\/strong> potrebbe essere contrassegnata come <strong>astratta<\/strong> perch\u00e9 \u00e8 unica per la nostra implementazione. Un altro modo di pensare alle funzioni astratte dal punto di vista della programmazione \u00e8 chiedersi: quali funzioni richiederanno funzionalit\u00e0 uniche?<\/p>\n<p>E in questo caso, la funzione del <strong>modulo<\/strong> \u00e8 proprio quella perch\u00e9 ogni widget sar\u00e0 diverso in modo univoco rispetto a ci\u00f2 che rende. La funzione <strong>widget<\/strong> pu\u00f2 anche essere contrassegnata come astratta perch\u00e9 restituisce il contenuto del widget. Questo contenuto \u00e8, naturalmente, basato sulla funzionalit\u00e0 che abbiamo implementato nella nostra implementazione.<\/p>\n<p>Inoltre, il codice sorgente della stessa classe <strong>WP_Widget<\/strong> dice:<\/p>\n<blockquote>\n<p>la funzione WP_Widget::widget() deve essere sovrascritta in una sottoclasse.&#8217;<\/p>\n<\/blockquote>\n<p>Questo \u00e8 precisamente il tipo di funzione che dovrebbe essere contrassegnata come astratta. Perch\u00e9 PHP generer\u00e0 un errore se una funzione \u00e8 contrassegnata come astratta e non implementata. Non avevamo bisogno di chiamate di funzione <strong>die<\/strong> o qualcosa del genere.<\/p>\n<p>Le altre funzioni, tuttavia, non dovranno necessariamente essere contrassegnate come astratte ed ecco perch\u00e9:<\/p>\n<ol>\n<li><strong>__construct<\/strong> chiamer\u00e0 il costruttore del genitore, al livello pi\u00f9 elementare, e questo \u00e8 necessario per inizializzare la classe base. Non dimenticare, per\u00f2; possiamo aggiungere le nostre propriet\u00e0 a questo metodo che sono uniche per la nostra classe.<\/li>\n<li><strong>update\u00a0<\/strong> utilizza la funzionalit\u00e0 nella classe padre per la serializzazione delle informazioni.<\/li>\n<\/ol>\n<p>Quindi, ci rimangono due funzioni che potrebbero essere contrassegnate come astratte in un&#8217;iterazione pi\u00f9 moderna della classe.<\/p>\n<h2>Prossimo<\/h2>\n<p>A questo punto, dovremmo essere tutti sulla stessa pagina per quanto riguarda il codice orientato agli oggetti. Almeno per quanto possiamo ottenere attraverso una serie di post sul blog.<\/p>\n<p>A partire dal prossimo post, torneremo a scrivere il codice.<\/p>\n<p>Cio\u00e8, rivisiteremo il <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> e lo refactoring nel suo stato attuale per adottare standard PHP pi\u00f9 moderni.<\/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=\"Widget WordPress: rileva la programmazione orientata agli oggetti\"><\/a><\/p>\n<p>Condivider\u00f2 le modifiche che sto apportando, le giustificazioni sul perch\u00e9, e poi parler\u00f2 anche del tipo di widget che costruiremo in base al boilerplate (e possiamo farlo).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <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&#8217;obiettivo \u00e8 fornirti tutto ci\u00f2 di cui hai bisogno per rilevare le pratiche orientate agli oggetti sia in questa API che in altre.<\/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":[896,804,720,865],"tags":[1168],"class_list":["post-231347","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231347"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231347\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/235594"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}