{"id":230398,"date":"2022-11-21T16:50:00","date_gmt":"2022-11-21T13:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230398"},"modified":"2022-11-21T16:52:21","modified_gmt":"2022-11-21T13:52:21","slug":"i-secondi-due-pilastri-delloop","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/i-secondi-due-pilastri-delloop\/","title":{"rendered":"I secondi due pilastri dell&#8217;OOP"},"content":{"rendered":"\n<p>Come ho detto nel <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"primo post di questa serie\">primo post di questa serie<\/a><\/strong>, sentirai spesso parlare dei tre pilastri della programmazione orientata agli oggetti. Potresti anche sentire parlare dei quattro pilastri della programmazione orientata agli oggetti.<\/p>\n<p>E non \u00e8 che ce ne siano in totale sette o qualcosa del genere. Invece, si tratta pi\u00f9 di ci\u00f2 che la gente considera fondamentale per l&#8217;OOP: ci sono tre o quattro concetti principali?<\/p>\n<p>Si pu\u00f2 dedurre dall&#8217;articolo precedente (per non parlare del titolo), credo che siano quattro.<\/p>\n<p>E in questo post, tratter\u00f2 gli ultimi due:<\/p>\n<ul>\n<li>Eredit\u00e0,<\/li>\n<li>e Polimorfismo<\/li>\n<\/ul>\n<p>Se hai eseguito qualsiasi tipo di programmazione orientata agli oggetti prima di leggere questo articolo, probabilmente avrai sentito parlare di almeno uno di questi.<\/p>\n<p>Indipendentemente da ci\u00f2, diamo un&#8217;occhiata a ciascuno di essi in modo pi\u00f9 dettagliato.<\/p>\n<h2>Altri due pilastri dell&#8217;OOP<\/h2>\n<p>Prima di saltare in ognuno di questi, voglio essere sicuro che tu sia coinvolto in ci\u00f2 che abbiamo trattato finora.<\/p>\n<h3>Una parola sull&#8217;analisi<\/h3>\n<p>Non soffermer\u00f2 il punto, ma l&#8217;intera ragione per cui ora parlo di fondamenti orientati agli oggetti \u00e8 perch\u00e9 ci stiamo muovendo in una fase diversa di questo materiale. Abbiamo iniziato coprendo la fase di <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analisi<\/a><\/strong> che comprendeva:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/programmazione-orientata-agli-oggetti-in-wordpress-analisi-parte-1\/\" title=\"Analisi, parte 1\">Analisi, parte 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/programmazione-orientata-agli-oggetti-in-wordpress-analisi-parte-2\/\" title=\"Analisi, parte 2\">Analisi, parte 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/programmazione-orientata-agli-oggetti-in-wordpress-comprendere-le-aspettative-dei-clienti\/\" title=\"Comprendere le aspettative dei clienti\">Comprendere le aspettative dei clienti<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/programmazione-orientata-agli-oggetti-in-wordpress-statement-of-work\/\" title=\"Dichiarazione di lavoro\">Dichiarazione di lavoro<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/programmazione-orientata-agli-oggetti-in-wordpress-termini-e-condizioni\/\" title=\"Termini e Condizioni\">Termini e Condizioni<\/a><\/li>\n<\/ol>\n<h3>Ora allo sviluppo<\/h3>\n<p>E ora siamo alla fase di <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sviluppo<\/a><\/strong>. Alcuni potrebbero chiamarlo fondamentali (ma sono contento che non puoi fare un buon sviluppo senza i fondamenti, quindi c&#8217;\u00e8 quello (.<\/p>\n<p>Se non hai letto <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"il post precedente\">il post precedente<\/a><\/strong>, ti consiglio di farlo prima di continuare in quanto copre i concetti di astrazione, incapsulamento e come si collega a WordPress.<\/p>\n<h3>3 Eredit\u00e0<\/h3>\n<p>Il concetto di eredit\u00e0 \u00e8 abbastanza facile da seguire. Cio\u00e8, una classe pu\u00f2 ereditare gli attributi di un&#8217;altra classe. Far\u00f2 alcuni esempi di questo in un momento, ma permettetemi di fornire una definizione di lavoro ai fini di questo post:<\/p>\n<blockquote>\n<p>L&#8217;ereditariet\u00e0 si riferisce all&#8217;idea che una classe, sebbene abbia la propria implementazione, eredita letteralmente propriet\u00e0, funzioni e implementazione generale da una classe padre.<\/p>\n<\/blockquote>\n<h4>Esempio 1: un documento<\/h4>\n<p>In termini molto semplici, supponiamo che tu abbia una classe chiamata Document e che un documento abbia un titolo e un contenuto. Poi c&#8217;\u00e8 una sottoclasse di documento che ha attributi per una data e un&#8217;ora. Potremmo chiamarlo un PostDocument o un PageDocument.<\/p>\n<p>Cio\u00e8, il PageDocument <strong>eredita<\/strong> le propriet\u00e0 e gli attributi di Document aggiungendo anche la propria implementazione. Ha senso?<\/p>\n<p>In caso contrario, non preoccuparti. All&#8217;inizio non fa sempre &quot;clic&quot;, quindi diamo un&#8217;occhiata a un altro esempio.<\/p>\n<h4>Esempio 2: un messaggio<\/h4>\n<p>Diciamo che abbiamo una classe Messaggio. Un messaggio ha tipicamente due propriet\u00e0:<\/p>\n<ul>\n<li>1 Un mittente,<\/li>\n<li>2 Un destinatario.<\/li>\n<\/ul>\n<p>\u00c8 giusto dire che ci sono diversi tipi di messaggi, giusto? Cio\u00e8, forse abbiamo un EmailMessage o forse abbiamo un TextMessage.<\/p>\n<p>Un EmailMessage ha ancora un mittente e ha ancora un destinatario ma ha molto di pi\u00f9, giusto? Ha cose come:<\/p>\n<ul>\n<li>una riga dell&#8217;oggetto,<\/li>\n<li>un allegato facoltativo,<\/li>\n<li>un altro insieme di mittenti a cui \u00e8 stato inviato,<\/li>\n<li>supporto per copiare altri nel messaggio pubblicamente o privatamente,<\/li>\n<li>e altro ancora.<\/li>\n<\/ul>\n<p>Un TextMessage d&#8217;altra parte non avr\u00e0 necessariamente tutto quanto sopra. Supponiamo che stiamo parlando di un messaggio SMS di base (rispetto a un messaggio di testo RTF in qualcosa come Hangouts, Telegram, iMessage o qualsiasi altra cosa sia l\u00e0 fuori).<\/p>\n<p>Questa classe:<\/p>\n<ul>\n<li>essere legato a un numero di telefono,<\/li>\n<li>pu\u00f2 includere un gruppo di altri destinatari tutti pubblici,<\/li>\n<li>un vettore (che \u00e8 un provider di telefonia mobile),<\/li>\n<li>un numero massimo di caratteri che pu\u00f2 contenere<\/li>\n<li>la possibilit\u00e0 di dividere un singolo messaggio in pi\u00f9 messaggi se il numero massimo di caratteri supera un determinato numero di caratteri.<\/li>\n<\/ul>\n<p>Ma solleva ancora domande su propriet\u00e0 e metodi (o, pi\u00f9 in generale, implementazione, giusto?)<\/p>\n<h4>Una parola sull&#8217;implementazione<\/h4>\n<p>Quando si tratta di programmazione orientata agli oggetti, abbiamo quelli che chiamiamo modificatori di accesso. Forse li hai letti altrove chiamati, diciamo, modificatori di visibilit\u00e0 o qualcosa del genere.<\/p>\n<p>\u00c8 tutto uguale.<\/p>\n<p>In breve, questi modificatori possono essere definiti come:<\/p>\n<blockquote>\n<p>Parole chiave che controllano ci\u00f2 che le altre classi hanno accesso alle informazioni a portata di mano.<\/p>\n<\/blockquote>\n<p>Fortunatamente, questa parte \u00e8 semplice da capire:<\/p>\n<ul>\n<li><strong>le propriet\u00e0 e le funzioni private<\/strong> sono accessibili solo alla classe in cui sono definite. Ci\u00f2 significa che PostDocument non pu\u00f2 utilizzare nulla in Document che \u00e8 contrassegnato come privato. A tutti gli effetti, PostDocument non \u00e8 nemmeno a conoscenza dell&#8217;esistenza di queste informazioni.<\/li>\n<li><strong>le propriet\u00e0 e le funzioni protette<\/strong> sono accessibili alla classe in cui sono definite ea qualsiasi classe che discende. Cio\u00e8, qualsiasi classe che eredita i dati dalla classe base o dalla classe genitore ha accesso ad essa. Quindi, a differenza dei dettagli di implementazione <strong>privati<\/strong>, PostDocument pu\u00f2 accedere alle informazioni da Document se \u00e8 contrassegnato come protetto.<\/li>\n<li><strong>le<\/strong> propriet\u00e0 e le funzioni pubbliche sono accessibili a chiunque. Questo non ha nulla a che fare con l&#8217;ereditariet\u00e0, in realt\u00e0, ma pi\u00f9 con l&#8217;incapsulamento, semmai. Invece, si tratta di decidere a cosa vogliamo che altri oggetti accedano.<\/li>\n<\/ul>\n<p>Quindi, come viene gestita l&#8217;implementazione? Questo varia da lingua a lingua, ma PHP non supporta quella che viene chiamata &quot;ereditariet\u00e0 multipla&quot;. In poche parole, una determinata classe in <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP pu\u00f2 ereditare (o estendere) solo un&#8217;altra classe<\/a>. Non pi\u00f9 classi (alcune lingue lo supportano).<\/p>\n<blockquote>\n<p>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>Nel nostro esempio, non possiamo introdurre un&#8217;altra classe come WrittenDocument che eredita da PageDocument cos\u00ec come PostDocument. O \u00e8 l&#8217;uno o l&#8217;altro. E vale la pena notare che se eredita da PostDocument, eredita anche le informazioni da Document perch\u00e9 \u00e8 una sottoclasse di una sottoclasse di una classe.<\/p>\n<h3>4 Polimorfismo<\/h3>\n<p>Ora che abbiamo una definizione di base di ereditariet\u00e0, possiamo parlare di polimorfismo. La buona notizia \u00e8 che \u00e8 una parola grossa e strana per un concetto molto semplice.<\/p>\n<p>La cattiva notizia \u00e8 che non abbiamo parlato di interfacce o di classi astratte. Questi stanno arrivando ma sono considerati parte dei quattro pilastri, quindi non preoccuparti per loro in questo momento.<\/p>\n<p>Invece, pensaci in questo modo:<\/p>\n<blockquote>\n<p>Il polimorfismo ci consente di fare riferimento a una classe di un tipo quando pu\u00f2 essere dichiarata come un altro tipo.<\/p>\n<\/blockquote>\n<p>Potrebbe ancora creare confusione, ma ricordi il nostro esempio di messaggio sopra? Possiamo creare un&#8217;istanza di una classe SMSMessage che <strong>estende<\/strong> la classe Message e quindi chiamare determinati metodi su di essa.<\/p>\n<p>L&#8217;SMSMessage pu\u00f2 avere un metodo che ha la classe Message. E se la classe \u00e8 stata istanziata come un&#8217;istanza della classe SMSMessage, chiamer\u00e0 quel metodo. Allo stesso modo, se non ha un metodo ma la sua classe padre, Message, ce l&#8217;ha, chiamer\u00e0 quel metodo.<\/p>\n<p>A volte, \u00e8 pi\u00f9 facile capirlo nel codice, quindi facciamolo.<\/p>\n<p>Per prima cosa, definiamo la nostra classe <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Messaggio<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nclass Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the Message class.n\";\n  }\n\n  public function receive()\n  {\n    echo \"This message was received from the Message class.n\";\n  }\n}\n<\/code><\/pre>\n<p>Quindi definiamo la nostra classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage<\/a>. Si noti che non ha una funzione di <strong>ricezione()<\/strong>. Questo sar\u00e0 importante momentaneamente:<\/p>\n<pre><code>&lt;?php\nclass SMSMessage extends Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the SMSMessage class.n\";\n  }\n}<\/code><\/pre>\n<p>Ora <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">istanziamo la nostra<\/a><\/strong> classe Message e chiamiamo alcuni metodi:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>E facciamo lo stesso <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usando la classe SMSMessage:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Se vuoi l&#8217;intero script, puoi vederlo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">qui<\/a><\/strong>, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">scaricarlo<\/a> ed eseguirlo localmente.<\/p>\n<h2>Ereditariet\u00e0, polimorfismo e WordPress<\/h2>\n<p>Ecco il take away (e lo esploreremo di pi\u00f9 quando entriamo nelle interfacce e nelle classi astratte): quando una classe <strong>estende<\/strong> un&#8217;altra classe e non ha i dettagli di implementazione che ha la sua classe genitore, verr\u00e0 utilizzata l&#8217;implementazione del genitore.<\/p>\n<p>Un altro modo di pensare \u00e8 &quot;allargare la catena di comando&quot;. Inizier\u00e0 con la classe pi\u00f9 bassa di quella che abbiamo creato. Nel nostro esempio sopra, questo \u00e8 SMSMessage. Se non lo trova l\u00ec, passer\u00e0 alla classe che estende. (E se non lo trova l\u00ec e quella classe estende una classe, prover\u00e0 l\u00ec.)<\/p>\n<p>L&#8217;intera cosa polimorfica \u00e8 questa: abbiamo istanziato una classe di un tipo, SMSMessage, ma sta usando l&#8217;implementazione di una classe di un altro tipo (che eredita, s\u00ec, ma \u00e8 comunque diverso).<\/p>\n<h3>Corsi di scrittura su WordPress<\/h3>\n<p>Infine, vorrei lasciarvi con questo: ho accennato qualcosa di simile a questo nel post precedente ma voglio ribadirlo qui.<\/p>\n<p>Indipendentemente dal numero di questi concetti utilizzati dal core di WordPress, non importa perch\u00e9 possiamo scrivere codice orientato agli oggetti di alta qualit\u00e0 su WordPress che interagisce con WordPress e che funziona bene con WordPress (e altri codici di terze parti, non sempre, ma molte volte).<\/p>\n<h2>Cosa succede dopo?<\/h2>\n<p>Successivamente, esamineremo interfacce e astrazioni.<\/p>\n<p>Questi sono ancora fondamentali per la programmazione orientata agli oggetti, ma se hai compreso i due post precedenti, sei pronto per una solida esperienza con i concetti imminenti.<\/p>\n<p>E se no, non preoccuparti! Puoi sempre parlarne nei commenti o possiamo parlarne di pi\u00f9 via e-mail.<\/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>Qui, concludo i miei due post sui quattro pilastri dell&#8217;OOP che coprono l&#8217;ereditariet\u00e0 e il polimorfismo insieme a una demo funzionale.<\/p>\n","protected":false},"author":1,"featured_media":164983,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,720,844],"tags":[1168],"class_list":["post-230398","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230398","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=230398"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230398\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}