Se questo è il primo tutorial che stai leggendo in questa serie, ti consiglio caldamente di riprendere quello che abbiamo trattato finora.
In sostanza, vieni alla fine dello spettacolo. A questo punto, abbiamo gettato le basi per il nostro plugin, scritto il plug-in, definito e analizzato namespace e autoloader. Non resta che applicare ciò che abbiamo imparato.
Quindi in questo tutorial, metteremo tutti i pezzi insieme. In particolare, rivedremo il codice sorgente del nostro plugin, lo spazio dei nomi di tutte le classi rilevanti e scriverò un caricatore automatico in modo da poter rimuovere tutte le nostre istruzioni di inclusione.
Discuterò tutto in dettaglio mentre lavoriamo attraverso il codice. Di nuovo, se questo è il primo tutorial che stai leggendo in questa serie, riprendi ciò che abbiamo visto finora e poi torna a questo tutorial.
A questo punto, dovresti avere familiarità con il modo in cui abbiamo impostato il nostro ambiente di sviluppo. Come aggiornamento, ecco una breve panoramica del software che stiamo utilizzando:
Avrai anche bisogno di una copia del codice sorgente del plugin con cui stiamo lavorando. Puoi prenderne una copia proprio qui. Supponendo che sia installato, attivato e che il tuo IDE sia in esecuzione, cominciamo.
Ricordiamo il tutorial precedente, sono un fan per assicurarmi che i nostri spazi dei nomi seguano l'organizzazione dei file su disco. Se osservi la struttura delle directory del nostro plugin o se hai seguito la serie fino ad ora, dovresti vedere qualcosa del genere:
Nota che se hai configurato il tuo plugin in modo diverso, va bene. I tuoi spazi dei nomi saranno probabilmente diversi, ma ciò non dovrebbe influire su tutto ciò che è contemplato in questa serie.
Usando la struttura delle directory come linea guida, esaminiamo tutti i file PHP che compongono il nostro plugin e definiamo i loro spazi dei nomi. Fare questo è semplice: si tratta semplicemente di utilizzare la parola chiave namespace e posizionare un nome qualificato nella parte superiore di ciascun file.
Li elenco tutti sotto.
class-meta-box.php
class-meta-box-display.php
Interfaccia-assets.php
class-css-loader.php
class-domanda-reader.php
Ci sono alcune cose da notare sulle convenzioni che ho usato sopra:
Tutsplus_Namespace_Demo
, che corrisponde al nome della directory del plugin.Tutsplus_Namespace_Demo \ Admin
e Tutsplus_Namespace_Demo \ Admin \ Util
corrispondono anche alle rispettive directory; tuttavia, i nomi delle directory sono cased (rispetto a essere in lettere minuscole).Infine, se hai provato ad aggiornare la pagina o hai provato a navigare su WordPress da quando hai introdotto le istruzioni namespace, allora probabilmente vedrai un errore nella tua console che assomiglia a qualcosa del genere:
E include il seguente messaggio:
Avviso PHP: call_user_func_array () si aspetta che il parametro 1 sia un callback valido, funzione 'tutsplus_namespace_demo' non trovata o nome funzione non valido in /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php sulla linea 524
O forse mostra:
Errore fatale PHP: Classe 'Meta_Box' non trovata in /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php on line 48
Oppure potresti vedere qualsiasi numero di altri messaggi di errore simili. Va bene. È normale.
Ma solleva la domanda: che succede con il nostro plugin? Fortunatamente niente. Questo è un comportamento previsto.
Il primo messaggio che vedi potrebbe essere il risultato di un altro plugin che hai installato. Non ero in grado di riprodurlo da solo; tuttavia, quando disattivo alcuni degli altri plug-in che ho in esecuzione, il plugin ha generato il secondo messaggio (che è il messaggio che volevo dimostrare).
Quando si scrive il codice del namespace, PHP si aspetta di localizzare una classe all'interno di un determinato spazio dei nomi. Concettualmente puoi pensare che le tue classi ora appartengano al loro pacchetto (o sotto pacchetto) o comunque tu lo definisca. E affinché una funzione possa accedere a una classe all'interno di un pacchetto, è necessario renderla consapevole dei pacchetti esistenti.
È qui che entra in gioco funzionalità di namespace e autoloading aggiuntive. Quindi, prima di provare ad accedere al nostro codice tramite i loro spazi dei nomi, lavoriamo su un caricatore automatico.
La scrittura di un caricatore automatico richiede quanto segue:
spl_autoload_register
Non lasciare che il nome spl_autoload_register
intimidirti. Significa semplicemente che questa è una funzione che fa parte della "Libreria PHP standard" ed è il modo in cui "registriamo" una funzione di "autoload". È un boccone da dire e molti personaggi da scrivere, ma è solo una funzione che useremo per dire a PHP come analizzare spazi dei nomi e nomi di classe e dove può trovare i nostri file.
Questa funzione ci consente di scrivere il nostro codice personalizzato per il caricamento automatico dei file e quindi di agganciare la funzione in PHP. Cioè, stiamo dicendo a PHP dove trovare i nostri file e come analizzare spazi dei nomi, nomi di file e così via in modo che includa i file.
Detto questo, siamo pronti per scrivere un autoloader.
Quando scrivi un autoloader, la cosa da tenere a mente è come sono organizzati i nostri file. Cioè, vogliamo sapere come mappare i nostri namespace alle nostre directory.
Nell'esempio che stiamo utilizzando, è semplice: gli spazi dei nomi sono versioni con involucro della struttura delle directory. Questo non è sempre vero per altri progetti; tuttavia, è ancora un altro motivo per cui mi piace organizzare logicamente i miei file in base alla loro posizione fisica.
Quando PHP tenta di caricare una classe, il nostro autoloader dovrà eseguire quanto segue:
Con tutti questi punti, il nostro lavoro è stato risolto per noi. Nella directory dei plugin, creare una sottodirectory chiamata inc
, e nel inc
directory crea un file chiamato autoload.php
.
All'interno di quel file, andiamo avanti e annulliamo la funzione che useremo per caricare automaticamente i nostri file. Dovrebbe assomigliare a qualcosa di simile a questo:
Ovviamente, questo non sta ancora facendo nulla.
Una nota a margine sulla scrittura di un caricatore automatico
Nota che scriverò il codice e i commenti del codice per spiegare a fondo cosa stiamo facendo. Se ti stai appena avventurando da solo per la prima volta, scrivere un caricatore automatico e utilizzare spazi dei nomi e lavorare con i file potrebbe essere un po 'frustrante. Questo è dove un debugger e l'utilizzo di file di registro possono tornare utili.
Questo è al di fuori dello scopo di questo tutorial, ma sappi che scrivere un caricatore automatico non è qualcosa che potresti avere ragione la prima volta che lo stai facendo.
Completamento del caricatore automatico
Iniziamo ad aggiungere alcune funzionalità dati i passaggi elencati all'inizio di questa sezione.
Innanzitutto, è necessario impostare un ciclo che esegua l'iterazione all'indietro attraverso le parti del nome file che vengono passate nella funzione di caricamento automatico. Lo facciamo perché rende più facile costruire un percorso per il caricamento automatico del file.
0; $ i--) // Altro a venire ...Dopo questo, dobbiamo guardare il
$ file_parts
e sostituisci tutte le occorrenze del trattino basso con un trattino perché tutti i nostri nomi di classe e l'interfaccia usano caratteri di sottolineatura mentre i nostri nomi di file utilizzano i trattini.Le seguenti due righe sono le prime due righe all'interno del ciclo che abbiamo soppresso sopra:
Successivamente, avremo bisogno di un condizionale che faccia alcune cose.
- Ha bisogno di controllare per vedere quale voce del percorso del nome del file che stiamo leggendo.
- Se siamo alla prima voce, allora siamo al nome del file; altrimenti, siamo nel suo spazio dei nomi.
- Successivamente, se stiamo leggendo la prima voce, dobbiamo determinare se stiamo cercando di caricare automaticamente un'interfaccia o stiamo caricando una classe.
- Se è il primo, allora dobbiamo modificare il nome dell'interfaccia in modo che venga caricato correttamente in base al suo nome file; altrimenti, caricaremo la classe in base al valore nel file
$ corrente
variabile.Sembra molto, ma non dovrebbe essere terribilmente complicato da leggere. Vedi il codice commentato qui sotto:
Fatto questo, è tempo di creare un percorso completo per il file. Fortunatamente, questo è poco più della semplice concatenazione di stringhe:
Infine, dobbiamo assicurarci che il file esista. In caso contrario, verrà visualizzato un messaggio di errore standard di WordPress:
E a questo punto, abbiamo un autoloader completo (che può essere recuperato scaricando i file dal link nella barra laterale di questo post in quanto il codice sorgente sarebbe un po 'lungo da postare qui nel tutorial).
Infine, è importante notare che questa particolare funzione potrebbe (o dovrebbe) essere riscritta come una classe. Inoltre, la classe dovrebbe essere composta da diverse funzioni più piccole delle quali sono testabili, hanno una singola responsabilità e leggere più chiaramente di ciò che è sopra. Forse in un tutorial bonus, descriverò il processo di come sarebbe.
Ma stiamo ancora includendo i file
Se guardi vicino alla parte superiore del file del plugin principale (o al file di bootstrap che abbiamo spesso chiamato), noterai diversi
includere
affermazioni che assomigliano a questo:Visto il lavoro che abbiamo svolto fino a questo punto, possiamo finalmente rimuovere queste affermazioni e sostituirle con una sola:
Per essere chiari, lo stiamo sostituendo con il nostro autoloader. A questo punto, dovremmo fare con il nostro plugin.
Mettere tutto insieme
Ora che abbiamo assegnato il nostro codice al namespace per fornire un'organizzazione logica delle classi correlate e scritto un autoloader per includere automaticamente i file in base allo spazio dei nomi e al percorso di ogni classe, dovremmo essere in grado di avviare il nostro plugin e farlo funzionare esattamente come ha fatto durante la prima iterazione riuscita.
L'ultima cosa che dobbiamo fare è assicurarsi di aggiornare il file di bootstrap in modo da istruire PHP a utilizzare gli spazi dei nomi per
Meta_Box
,Meta_Box_Display
, ilQuestion_Reader
, e ilCSS_Loader
.dentro(); $ Meta_box-> init ();Nota nel codice sopra stiamo usando PHP
uso
parola chiave e stiamo anteponendo i nomi delle classi con i loro subpackages immediati. Puoi leggere ulteriori informazioni sull'uso nel manuale, ma in breve è:Il uso la parola chiave deve essere dichiarata nell'ambito più esterno di un file (l'ambito globale) o all'interno delle dichiarazioni dello spazio dei nomi. Questo perché l'importazione viene eseguita in fase di compilazione e non in fase di runtime, quindi non può essere a scopo di blocco.Detto questo e supponendo che tutto funzioni correttamente, dovresti essere in grado di navigare verso Aggiungi nuovo post pagina (o Modifica postpagina, visualizza la nostra meta-box e visualizza un messaggio di domanda nella parte superiore della barra laterale:
Se è così, allora congratulazioni. Hai configurato correttamente il tuo plug-in per i tuoi spazi dei nomi e il caricamento automatico. In caso contrario, ricontrolla il codice con quello che abbiamo condiviso qui, controlla i log degli errori e assicurati che nulla sia fuori dall'ordinario nella schermata di amministrazione di WordPress.
Se tu fare vedere qualcosa, le probabilità sono che ha a che fare con qualcosa di minore. Rivedi il codice che abbiamo trattato, confrontalo con quello che è allegato qui a questo post (nella barra laterale insieme al grande pulsante blu), e vedi se riesci a restringere il problema.
Conclusione
A questo punto, abbiamo raggiunto la fine della nostra serie. Durante gli ultimi quattro tutorial, abbiamo coperto molti aspetti:
In definitiva, gran parte del materiale coperto in questa serie può essere utilizzato in progetti esistenti e futuri sui quali potresti lavorare.
Ricorda che puoi trovare altri prodotti correlati a WordPress nel nostro marketplace. E se vuoi saperne di più sullo sviluppo di soluzioni per WordPress, puoi trovare tutti i miei tutorial e serie sulla mia pagina del profilo. Non esitare a seguirmi sul mio blog o su Twitter mentre discuto quasi quotidianamente lo sviluppo di software nel contesto di WordPress.
E ricorda, il link è per il download del codice sorgente finale è nella barra laterale sotto un pulsante intitolato Scarica allegato. Naturalmente, non esitate a fare domande nei commenti!
spl_autoload_register
uso