Programmazione orientata agli oggetti in WordPress Ereditarietà I

Una delle parti più difficili della scrittura di una serie per principianti sulla programmazione orientata agli oggetti è sapere dove fermarsi.

Ci sono così tanti argomenti da trattare che possiamo lentamente iniziare a muoverci verso la direzione delle tecniche di programmazione avanzate, in definitiva rinunciando esattamente alla nostra missione prevista: armare i principianti con una serie di strumenti, strategie e comprensione dei concetti iniziali.

Innanzitutto, nota che nell'ultimo post della serie abbiamo completato il nostro primo plug-in completo utilizzando tecniche orientate agli oggetti. Per la maggior parte, ha incapsulato tutto ciò che abbiamo coperto attraverso questo punto della serie (eccetto, ovviamente, l'ereditarietà).

A tal fine, assicurati di recuperare i seguenti articoli:

  1. Un introduzione
  2. Classi
  3. tipi
  4. Strutture di controllo: dichiarazioni condizionali
  5. Strutture di controllo: cicli
  6. Funzioni e attributi
  7. Scopo
  8. Costruire il plugin I
  9. Costruire il plugin II
  10. Documenta il plugin I
  11. Documenta il plug-in II

È molto, lo so, ma ricorda: l'obiettivo della serie è preparare il principiante assoluto con tutto ciò che è necessario per lavorare con PHP e scrivere plugin WordPress usando tecniche orientate agli oggetti.

A tal fine, ho deciso di iniziare a racchiudere questa serie con un articolo in due parti (con una terza parte finale che funge da sommario) che offre un seguito al prossimo argomento di sviluppo per aspiranti programmatori PHP: Ereditarietà.

Ancora una volta, per coloro che sono programmatori più esperti, l'ereditarietà non è un obiettivo per te; tuttavia, se sei un principiante, l'ereditarietà è uno dei concetti che è facile da comprendere, un po 'più impegnativo da implementare (che ci crediate o meno) e che può causare ancora più confusione quando si tratta di argomenti come il polimorfismo ( di cui parleremo più avanti)

Nei prossimi due articoli, cercherò di coprire tutto quanto sopra insieme al codice di esempio per eseguirne il backup. Ma prima di esaminare un codice, penso che sia importante capire i concetti di importanza, esaminare alcuni dei passaggi necessari per preparare il codice orientato agli oggetti per l'ereditarietà.

In questo articolo, stiamo definendo l'ereditarietà, cercando di formare un modello concettuale di ciò che sta realmente accadendo, esaminando le sfumature di quelle che sono note come classi base e sottoclassi, così come alcune delle parole chiave riservate nella lingua che deve essere regolato per supportare l'ereditarietà attraverso le classi.

Quindi con quello messo da parte come la nostra roadmap per l'articolo, andiamo avanti e cominciamo.

Eredità definita

A differenza di molti altri termini di programmazione, l'ereditarietà è in realtà una parola che descrive abbastanza bene il concetto. Direttamente da Wikipedia:

Nella programmazione orientata agli oggetti (OOP), l'ereditarietà è quando un oggetto o una classe è basata su un altro oggetto o classe, utilizzando la stessa implementazione. È un meccanismo per il riutilizzo del codice. Le relazioni di oggetti o classi attraverso l'ereditarietà danno origine a una gerarchia.

Relativamente chiaro, non è vero? Ma penso che possiamo fare di meglio.

In precedenza in questa serie, abbiamo parlato di quanti dei linguaggi di programmazione più comuni utilizzano esempi come Animali e veicoli come un modo per dimostrare il concetto di programmazione orientata agli oggetti.

Dopo tutto, l'idea alla base della programmazione orientata agli oggetti è che dovremmo modellare oggetti del mondo reale? Bene, un po '. Ma quante volte hai visto un fisico? Post sul blog?

Esattamente.

Come tale, mi piace sempre provare a mettere le cose nella prospettiva di qualcosa che è molto più tangibile, più pratico, e che è più strettamente correlato al contenuto che creeremo in realtà.

Detto ciò, è un modo adeguato di descrivere l'ereditarietà nel contesto della programmazione orientata agli oggetti che non distrugge il concetto attraverso l'uso di esempi banali?

Proviamo questo: 

L'ereditarietà è quando una classe funge da classe genitore per una classe figlia che fornisce un numero di attributi e metodi comuni sia al genitore che al bambino; tuttavia, il bambino come la capacità di introdurre i propri attributi.

Nella citazione di cui sopra, stiamo usando un paio di termini come "classe genitore" e "classe figlio", ognuno dei quali chiariremo un po ', ma il punto è che possiamo letteralmente creare una gerarchia di classi tutte quale ereditare informazioni dalle loro classi genitore.

Forse anche più ordinario, ogni volta che si lavora con una classe figlia e si desidera sfruttare gli attributi e le funzioni definiti nella classe genitore o nella classe base, è possibile farlo facilmente senza codice aggiuntivo.

Ma stiamo superando noi stessi. Prima di farlo, assicuriamoci di ottenere un modello concettuale di come sia l'ereditarietà. Dopotutto, anche se stiamo scrivendo codice, stiamo provando a fornire un modello che non rappresenti solo un oggetto reale, ma crei anche una relazione tra gli oggetti.

Visualizzazione dell'eredità

Prima di andare oltre, diamo un'occhiata a un diagramma di classe molto semplice su come funziona l'ereditarietà. 

Nota che stiamo usando tre classi:
  • Soddisfare che servirà da classe base e che rappresenta un tipo generico di informazioni che contiene dati per altri tipi di contenuti più specifici.
  • Commento che rappresenta un commento su un post del blog. Questa classe contiene informazioni da cui eredita Soddisfare e che definisce in se stesso.
  • Inviare inoltre eredita da Soddisfare che rappresenta un singolo post sul blog. Contiene generale Soddisfare informazioni, ma contiene anche le proprie informazioni specifiche per quella classe.

Ora, questo è chiaramente un esempio semplificato di ereditarietà, ma al suo centro questo è come funziona l'ereditarietà. In un prossimo articolo, daremo un'occhiata a come funzionano anche l'istanziazione, l'accesso ai dati e altre funzionalità.

Ma prima, dobbiamo ancora chiarire alcuni termini e assicurarci di avere tutte le informazioni corrette.

Jargon di classe

Come abbiamo accennato in precedenza in questa serie, ci sono un certo numero di termini che abbiamo usato tutti i quali sono fondamentali per capire come i vari elementi dell'eredità lavorano insieme.

A tal fine, è importante definire alcune definizioni comuni per le parole che utilizziamo non solo per il modo in cui le utilizziamo in questo articolo, perché non le vedrai solo qui usate, ma stai andando per vederli usati altrove e li vedrai usati in modo intercambiabile in altri articoli sul web:

  • Una classe genitore, detta anche classe base, è la classe da cui altre classi ereditano le informazioni, come dimostrato nella figura sopra. Mantiene un insieme di proprietà e funzioni.
  • Si noti che alcune delle funzioni disponibili nella classe base sono classi di terze parti, le classi secondarie o solo all'interno della classe base stessa.
  • La classe figlio, tipicamente chiamata sottoclasse, è la classe che eredita informazioni, dati e funzionalità dalla sua classe genitore. 
  • Vedremo il codice al riguardo nel prossimo post; tuttavia, nota che l'accesso ai dati va solo in un modo. Cioè, le sottoclassi possono accedere alle informazioni nella loro classe base, ma le classi base non sono consapevoli delle loro sottoclassi.

Questo dovrebbero chiarire una buona parte della terminologia intorno a questo; tuttavia, in caso contrario, pensatelo in termini di, ad esempio, un albero genealogico in cui avete genitori e figli. I bambini ereditano i tratti dai loro genitori, ma i genitori non ereditano i tratti dei loro figli.

Si noti inoltre che, in fase di programmazione, alcuni sviluppatori desiderano introdurre quella che viene chiamata "ereditarietà multipla", che in pratica significa che una singola classe può ereditare proprietà e metodi da più classi.

Non solo questo è limitato in PHP, ma è anche al di fuori dello scopo di questa particolare serie.

Un Aside per lezioni astratte

Per coloro che hanno un po 'più di familiarità con il concetto di ereditarietà, probabilmente avrai anche familiarità con il concetto di classi astratte.

Poi di nuovo, se hai familiarità con il concetto di classi astratte, direi che non sei un principiante e non sei davvero il pubblico di destinazione per il contenuto che stiamo raggiungendo con questo articolo. 

Quindi, a seconda del feedback su questo articolo, di questa serie, e se gli altri sono interessati, forse possiamo fare un articolo di follow-up o un paio di articoli che coprono questo argomento esatto.

In arrivo…

Nel prossimo articolo, continueremo la nostra discussione sull'ereditarietà mentre diamo un'occhiata a come implementarlo in PHP. Daremo anche un'occhiata a come le sottoclassi possono accedere ai dati dai loro genitori e in che modo le classi genitore possono proteggere le informazioni dentro se stesse

Nel frattempo, assicurati di lasciare commenti, domande e / o commenti sull'ereditarietà nel feed dei commenti e cercherò di risolverli qui o nel prossimo post.

Fino ad allora!