Programmazione orientata agli oggetti in WordPress Ereditarietà II

Nel precedente articolo, abbiamo introdotto il concetto di ereditarietà orientata agli oggetti, tentato di collocare termini di laico, e poi abbiamo anche preso uno sguardo ad alto livello sul modello concettuale di come funziona nel contesto della programmazione.

Ma prima di andare oltre e / o se ti stai solo iscrivendo alla serie, ti preghiamo di rivedere tutto ciò che abbiamo trattato fino ad ora leggendo gli articoli precedenti:

  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
  12. Eredità I

Sì, ne abbiamo parlato molto, ma per gettare le basi per un principiante per avere un posto forte da cui iniziare a scrivere PHP orientato agli oggetti, c'è molto da esaminare.

Detto questo, l'ereditarietà è il punto in cui iniziamo a entrare negli argomenti intermedi del paradigma, quindi questo sarà l'articolo finale che fornisce uno sguardo ai concetti per principianti dopo di che termineremo la serie con un post di sintesi.

Eredità acquisita

Ricordiamo che abbiamo definito l'ereditarietà come segue:

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.

È un po 'meno formale di quello che potresti trovare in un libro accademico, o anche su Wikipedia, ma spiega ancora l'idea in termini che illustrano il punto.

In questo articolo, esamineremo tutto il codice, le funzioni e le parole riservate necessarie relative all'argomento, daremo un'occhiata a come possiamo implementarlo in PHP in un modo molto semplice e indipendente dalla piattaforma. , E quindi esamineremo un'implementazione effettiva di dove l'ereditarietà è in gioco all'interno di WordPress.

Quindi con quel set come la nostra roadmap per l'articolo, andiamo avanti e iniziamo.

Strutture PHP

Per implementare l'ereditarietà nel PHP orientato agli oggetti, ci sono un certo numero di parole riservate con le quali abbiamo bisogno di familiarizzare. Fortunatamente, la maggior parte delle parole che abbiamo già trattato e quelle che non abbiamo sono abbastanza chiare in modo che sia facile ricordarle.

Quindi, prima di approfondire la questione del codice, diamo un'occhiata a tutte le parole riservate nella lingua che dobbiamo conoscere in modo che possiamo iniziare a creare realmente qualcosa.

  • si estende è una parola riservata che indica che una classe è figlia di un'altra classe. Ad esempio, nel nostro precedente articolo, a Inviare si estende Soddisfare. Vedremo presto questo in gioco.
  • privato è un attributo che viene applicato a proprietà e funzioni che indicano che sono accessibili solo nel contesto della classe in cui sono definiti.
  • protetta è simile a privato con l'eccezione che è possibile accedere alle proprietà e ai metodi contrassegnati come tali dalla classe data e da qualsiasi classe secondaria.
  • pubblico è il contrario di privato in questo significa che qualsiasi classe - la classe data, una sottoclasse o una classe di terze parti - può accedere alla proprietà o al metodo per cambiarne le informazioni o chiamare la funzione.

Devi anche avere familiarità con il :: operatore, ma lo esamineremo un po 'più avanti nell'articolo quando inizieremo a guardare il codice.

E questo è tutto - niente di terribilmente scoraggiante, vero? E ciò che è ancora meglio è che se ci hai seguito in questa serie, probabilmente avrai familiarità con ogni parola salvata si estende.

Comunque, detto questo, iniziamo a lavorare su un esempio.

Qualche codice di esempio

Per iniziare a scrivere un codice di esempio, abbiamo bisogno di esporre esattamente quello che stiamo per provare a modellare (dopotutto, questo è ciò che fa il codice, non è vero?). 

In linea con il tema usato in questa serie - specialmente nell'ultimo articolo - avremo una classe genitore chiamata Soddisfare, e due classi secondarie ognuna delle quali sarà nominata Commento e Inviare, rispettivamente.

Questo ci permetterà di vedere come le proprietà e i metodi esistono all'interno di una singola classe, e come i bambini possono accedere agli attributi dei loro genitori, così come i genitori possono proteggere le loro proprietà e funzioni dai loro figli, così come.

Ma l'implementazione dimostrerà molto più che parlarne, quindi iniziamo a scrivere del codice.

La classe genitore

Nel nostro esempio, la classe genitore sarà la Soddisfare perché entrambe le sottoclassi - cioè, il Inviare e il Commento - sono tipi di contenuti che hanno informazioni univoche associate a loro che non sono specifici per il Soddisfare classe.

La chiave dell'ereditarietà è identificare tutte le proprietà e i metodi che sono comuni a tutte le classi e tenerli definiti nella classe genitore o, nella nostra classe, in Soddisfare.

Anche se questo può variare in base a come viene visualizzato, verrà impostato Soddisfare tale che include:

  • una data in cui il contenuto è stato pubblicato
  • un autore 
  • un metodo per salvare il contenuto
  • un metodo per formattare il contenuto
  • un metodo per recuperare il contenuto
  • e un metodo per recuperare l'autore del contenuto 

Per prima cosa, esamineremo il codice, quindi spiegheremo tutto ciò che sta succedendo.

publish_date = $ date-> format ('Y-m-d H: i: s'); $ this-> author = "; public function save ($ author, $ content) $ this-> author = $ author; $ this-> content = $ this-> format_content ($ content); $ this-> content ; public function read () return $ this-> content; private function format_content ($ content) return strip_tags (stripslashes ($ content)); public function get_author () return $ this-> author;

Come accennato in precedenza, ne abbiamo due protetta attributi e a privato attributo. Ricorda che questo significa che tutte le sottoclassi possono accedere a $ publish_date e il $ autore, ma solo il Soddisfare può accedere a $ content attributo.

Si noti inoltre che gran parte del codice che si vede nella classe precedente è PHP di base orientato agli oggetti. Non c'è nulla che si distingua che tratta direttamente con l'ereditarietà diversa da alcuni dei modificatori di accesso che abbiamo dichiarato. Ciò significa che è relativamente comune codificare che abbiamo visto finora in questo tutorial.

Una delle cose che vale la pena notare è che la funzione privata è in atto per dimostrare due cose:

  1. Come privato le funzioni sono accessibili solo nel contesto della classe in cui è definita.
  2. Elimina eventuali tag e barre dal contenuto in modo che il markup non possa essere salvato con il contenuto.

Naturalmente, questo codice non è collegato a un database oa un file system o altro, ma il punto rimane ancora.

Nota che nel codice sopra ci sono un paio di cose che abbiamo bisogno di aggiungere per soddisfare i requisiti di PHP. Esse vanno oltre lo scopo di questo articolo, ma vale la pena segnalarlo qui:

  • Il codice a date_default_time_set è necessario per impostare il fuso orario fuori dal quale il tempo può essere recuperato.
  • Il costruttore è responsabile per l'impostazione iniziale della data di pubblicazione del contenuto e inizializza la proprietà dell'autore su una stringa vuota. Questo è così che a Inviare può avere il suo autore e il Commento può avere anche il suo autore. Come vedremo più avanti, a Commento può persino ignorare la data di pubblicazione predefinita.

Nota anche che siamo in grado di recuperare il contenuto dal leggere metodo e siamo in grado di ottenere l'autore dal get_author funzione.

Il primo figlio

Avanti, andiamo avanti e creare il Inviare sottoclasse. Per prima cosa, daremo un'occhiata al codice e poi vedremo come interagisce con Soddisfare classe che abbiamo appena creato.

autore = "Tom McFarlin";  post di funzioni pubbliche ($ content) $ this-> format_content ($ content); 

La classe sembra piccola, giusto? Non ci sono proprietà - perché le eredita dal Soddisfare classe - e ci sono solo due funzioni, una delle quali è unica per la classe - inviare.

Si noti che nel costruttore, prima facciamo una chiamata al costruttore genitore usando il :: operatore. Puoi leggere molto di più su questo nel manuale, ma basti dire che l'operatore è riservato per fare riferimento a una serie di differenze rispetto alla classe in cui è definito. Nel nostro caso, questa è la chiamata al costruttore del genitore.

Successivamente, ho deciso di impostare il mio nome come autore del post. Si noti che sto usando il $ questo parola chiave. Poiché la sottoclasse eredita le proprietà dal relativo genitore, può fare riferimento a tali proprietà e se sono state definite all'interno di se stessa.

Nota che questo è possibile non solo perché Post estende il contenuto ma poiché la proprietà è contrassegnata come protetta nel Soddisfare, anche. Se fosse segnato come privato, questo non sarebbe possibile.

Il secondo bambino

Ora che abbiamo creato il Inviare classe, abbiamo anche il Commento classe che, ricorda, rappresenta qualcuno che lascia un commento su un post. Se si trattasse di questo codice a livello di produzione, ci sarebbe molto più codice: avremmo bisogno di correlare un commento a un post, determinare se un commento è una risposta a un commento esistente, contrassegnare lo stato di un commento e così via.

Ma ai fini della dimostrazione eredità, stiamo lasciando tutto questo fuori e concentrandoci solo sulle cose che possono guidare i concetti.

salva ('John Doe', $ commento); 

Come puoi vedere, il Commento il codice non è molto diverso dal Inviare codice. In una certa misura, questo è positivo perché mostra che abbiamo estratto le parti corrette nella nostra classe base. 

Ad ogni modo, nota che dopo aver costruito il Commento, facciamo la nostra chiamata al costruttore genitore. Successivamente, definiamo il Inserisci metodo che è responsabile per prendere il commento in arrivo e quindi salvarlo passando l'autore del commento e il suo contenuto al salvare metodo.

La cosa bella è che il salvare il metodo è già definito all'interno della classe base che gestisce anche tutta la formattazione attraverso l'uso di a privato funzione, quindi acquisiamo tale funzionalità mentre creiamo la nostra classe figlio.

Lavorare con l'esempio

Fatto questo, eseguiamo un paio di esempi per mostrare come i pezzi combaciano. Per assicurarsi che questo codice venga eseguito, tutto ciò che serve è un server Web, una directory da cui eseguire script PHP e un editor di testo.

Innanzitutto, creeremo un'istanza di Soddisfare e quindi chiameremo un'istruzione debug in modo che possiamo vedere cosa costituisce un'istanza della classe.

$ content = new Content (); var_dump ($ content);

Se tutto funziona correttamente, dovresti vedere tutto ciò che è sopra.

Avanti, andiamo avanti e creare un post. Dato che stiamo impostando tutte le informazioni nel contesto della classe, tutto ciò che dobbiamo veramente fare è chiamare una funzione sulla classe per visualizzare le informazioni.

Per esempio:

$ post = new Post (); echo 'L'autore del post è:'. $ Post-> get_author ();

Di nuovo, dato che abbiamo impostato tutto nel codice stesso, la semplice chiamata del metodo dimostra il concetto.

Finalmente, possiamo creare un Commento, chiama il Inserisci metodo su un'istanza della classe, tenta di passare il codice dannoso (solo per vederlo spogliato dal nostro codice). Se tutto va bene, dovresti vedere quanto segue:

$ comment = new Comment (); $ comment-> aggiungi (''); echo 'Il commento dice:'. $ Comment-> read ();

E questo è tutto: la nostra semplice dimostrazione di ereditarietà.

Ereditarietà in WordPress

Quando si tratta dell'ereditarietà in WordPress, la prima cosa che viene in mente per me stesso - e probabilmente altri sviluppatori - è l'API Widget. La ragione per cui dico questo è perché l'API è alimentata dall'ereditarietà.

Certo, i widget possono essere creati senza utilizzare l'API, ma direi che è un passo falso in fase di sviluppo. Perché rendere le cose più complicate per te stesso quando esiste già una base per farlo? Ma sto divagando.

La cosa bella di questa particolare API è che mette in mostra tutti i punti salienti della programmazione orientata agli oggetti e dell'ereditarietà sul lavoro. Ad esempio, ecco un esempio di codice preso direttamente dal Codex:

Ora che abbiamo trattato il modello concettuale, esaminato le parole chiave e la metodologia, scritto il nostro codice e creato il nostro esempio, questo dovrebbe essere relativamente facile da seguire.

Ma ecco la cosa: uno dei modi migliori per migliorare la scrittura di qualsiasi tipo di codice è di praticare continuamente i concetti. Cioè, per esplorare le idee scritte da altre persone che hanno fatto cose più avanzate che hai prima.

Caso in questione, date un'occhiata al primo esempio fornito nel codice WordPress. E se stai lavorando con una versione successiva di PHP che supporta funzionalità come namespace (un argomento leggermente più avanzato), controlla anche il secondo esempio.

Più rivedi il codice e lo prendi in giro, più ne impari. Ma andare oltre a questo in questo articolo ci porterà fuori dal campo di applicazione dell'intera serie.

All'estremità

A questo punto, abbiamo coperto tutto il materiale per principianti necessario per gettare le basi per una guida per principianti alla scrittura di PHP orientato agli oggetti. Nell'articolo finale, forniremo un riepilogo di tutto ciò che abbiamo trattato in modo da avere un unico riferimento per le grandi idee che possono essere segnalate, salvate o riferite in seguito.

Inoltre, avremo un breve periodo di discussione su una serie di follow-up, ma lo salveremo fino ad allora.

Per ora, se avete domande, commenti e / o feedback sul contenuto, codice o esempi sopra, sentitevi liberi di farlo nella sezione commenti qui sotto.