Oltre il prefisso: una guida per sviluppatori WordPress agli spazi dei nomi PHP
Pubblicato: 2019-11-12Prefisso tutto.
È un adagio vecchio quanto il software WordPress stesso. Il prefisso è stato uno standard per gli sviluppatori di WordPress per così tanto tempo che è difficile immaginare di fare qualcosa di diverso. Ma è giunto il momento per qualcosa di nuovo. Bene, è scaduto da tempo, ma WordPress è un po' indietro rispetto alle pratiche standard nel più ampio mondo PHP.
Il prefisso è la pratica di creare una versione compatibile con il codice del nome del progetto e di attaccarla in primo piano a funzioni, classi e altre cose nello spazio dei nomi globale. Ad esempio, dovresti nominare una funzione tavern_get_post() invece di get_post() per evitare conflitti di nomi di funzione, che risulteranno in un errore irreversibile.
Il prefisso è una forma di "spaziatura dei nomi", che è solo un modo elegante per dire che i nomi in questo spazio appartengono a un progetto specifico. Tuttavia, il prefisso (e il suffisso, che è meno comune) è un hack di un'epoca in cui non esisteva alcuna soluzione per il linguaggio PHP.
PHP 5.3 ha introdotto un metodo ufficiale di namespace, quindi lo standard esiste da anni. Poiché WordPress 5.2 ha portato il requisito minimo di PHP a 5.6, è tempo che gli sviluppatori si liberino delle loro vecchie abitudini e raggiungano il resto del mondo PHP.
Spazio dei nomi (quasi) tutto
Lo spazio dei nomi PHP copre solo i seguenti elementi.
- Classi
- Interfacce
- Tratti
- Funzioni
- Costanti dichiarate con la parola chiave
constma nondefine()
Quando si tratta di handle di script, nomi delle dimensioni dell'immagine, opzioni di database e altri elementi nello spazio dei nomi globale, è comunque necessario prefissarli. Questi sono ID e non rientrano nell'ambito dello spazio dei nomi PHP.
Come creare spazi dei nomi
Gli spazi dei nomi sono semplici da dichiarare. Nella parte superiore di qualsiasi file PHP in cui desideri utilizzare un particolare spazio dei nomi, dichiaralo come mostrato nel seguente frammento di codice.
<?php spazio dei nomi Taverna;
Ciò che fa questa riga di codice è dichiarare che ogni cosa all'interno di questo particolare file ha lo spazio dei nomi di Tavern .
Dai un'occhiata a una semplice funzione sotto quello spazio dei nomi per l'output di Hello, World! Messaggio.
<?php
spazio dei nomi Taverna;
funzione ciao() {
_e( 'Hello, World!', 'example-textdomain' );
} Se seguendo le vecchie regole di prefisso, hello() sarebbe stato chiamato tavern_hello() . Tuttavia, questo non è il caso degli spazi dei nomi. La funzione hello() è incapsulata all'interno dello spazio dei nomi Tavern e non entrerà in conflitto con altre funzioni denominate hello() .
Le classi e le interfacce funzionano come le funzioni. Con un nome di classe Article , il file di classe potrebbe essere simile al seguente.
<?php
spazio dei nomi Taverna;
classe Articolo {
// ...
}Nota: dovrebbe esserci sempre una sola classe o interfaccia per file. Ciò è particolarmente importante se prevedi di utilizzare un caricatore automatico.
Come assegnare un nome agli spazi dei nomi
Agli sviluppatori piace discutere su come dare un nome alle cose e non esiste una soluzione valida per tutti. La regola più importante è essere univoci per evitare conflitti con il codice di altri progetti. Uno dei modi migliori per farlo è utilizzare uno spazio dei nomi del Vendor di livello superiore con uno spazio dei nomi secondario del Package .
Supponiamo che lo spazio dei nomi del fornitore fosse Tavern e il progetto in questione fosse un tema WordPress chiamato News . Lo spazio dei nomi per il progetto potrebbe essere simile al seguente.
<?php spazio dei nomi Taverna\Notizie;
Potrebbe essere un po' prolisso per alcuni sviluppatori. Se il nome del tuo progetto è già abbastanza univoco, come "Awesomesauce", potresti semplicemente voler usare quanto segue.
<?php spazio dei nomi Awesomesauce;
Ti consigliamo di inventare una sorta di convenzione standard, almeno per te stesso. Alla fine, vorrai entrare in cose come il caricamento automatico, quindi avere un sistema che segui in tutti i tuoi progetti ti aiuterà. Sentiti libero di esaminare lo standard PHP-FIG Autoloader.
Importazione di classi e funzioni in uno spazio dei nomi diverso
Quando è necessario utilizzare una classe o una funzione da uno spazio dei nomi diverso dallo spazio dei nomi corrente, è necessario importarlo. Questo viene fatto tramite la parola chiave use in PHP.

L'istruzione use deve venire dopo la dichiarazione dello namespace dei nomi. Dovrebbe anche fare riferimento al nome della classe completamente qualificato. Il codice seguente importa la classe Tavern\Helpers\Post in un file con uno spazio dei nomi diverso.
<?php spazio dei nomi Taverna\Modello; usa Taverna\Aiutanti\Posta;
Una volta importato, puoi usare la classe Post direttamente come mostrato nello snippet successivo.
$post = nuovo messaggio();
A partire da PHP 5.6, puoi anche importare funzioni e costanti da altri namespace usando rispettivamente la use function use const . Il blocco di codice seguente illustra come importare sia una funzione che una costante.
<?php spazio dei nomi Taverna\Modello; usa la funzione Taverna\Aiutanti\nome_funzione; usa const Tavern\Helpers\NOME_COSTANTE;
Classi e funzioni aliasing
Alla fine, ti imbatterai in una situazione in cui devi importare una classe o una funzione che ha lo stesso nome di una classe o funzione all'interno dello spazio dei nomi corrente. Potresti pensare che questo sia il problema che gli spazi dei nomi dovevano risolvere. Fortunatamente, PHP fornisce un metodo per creare un alias durante l'importazione.
Supponiamo di avere una classe denominata Tavern\User e di dover implementare l'interfaccia Tavern\Contracts\User . Quando importi l'interfaccia, dovrai creare un alias come mostrato di seguito.
<?php
spazio dei nomi Taverna;
usa Tavern\Contracts\User come UserContract;
class Utente implementa UserContract {
// ...
} L' as UserContract aggiunto alla fine dell'istruzione use crea un alias per l'interfaccia User . Puoi tranquillamente utilizzare il nuovo nome UserContract senza errori.
Classi, interfacce, funzioni e costanti seguono tutti lo stesso metodo per creare un alias.
Organizzare la struttura delle cartelle in base agli spazi dei nomi
È pratica standard nel più ampio mondo PHP che gli spazi dei nomi e la struttura di file e cartelle del progetto corrispondano. In questo modo è facile per gli altri sviluppatori individuare facilmente il codice all'interno del tuo progetto. Inoltre, semplifica la creazione di caricatori automatici per il caricamento di classi su richiesta.
In genere, tutto il codice PHP dovrebbe andare in una cartella /src , /inc o con un nome simile nel tuo progetto. Un esempio di struttura di file e cartelle di plug-in potrebbe essere simile alla seguente.
/nome-plugin
/src
/Nucleo
/Attiva.php
/Installazione.php
/Visualizzazione
/Post.php
/Pagina.php Se seguisse la stessa struttura con gli spazi dei nomi, i file .php sopra conterrebbero le seguenti classi.
-
Tavern\Core\Activate -
Tavern\Core\Setup -
Tavern\View\Post -
Tavern\View\Page
Tieni presente che i nomi di file e cartelle fanno distinzione tra maiuscole e minuscole e dovrebbero corrispondere esattamente allo spazio dei nomi e al nome della classe.
Naturalmente sei libero di seguire qualsiasi convenzione desideri. Tuttavia, la raccomandazione precedente è una buona pratica e semplificherà il modo in cui organizzerai i tuoi progetti a lungo termine.
Vantaggi dell'utilizzo degli spazi dei nomi
Il vantaggio più evidente è evitare conflitti tra classi e funzioni con lo stesso nome. Dovresti usare spazi dei nomi reali per lo stesso motivo per cui hai usato i prefissi.
Gli spazi dei nomi aiutano a evitare nomi di classi lunghi. Digitare nomi lunghi durante un grande progetto è una pratica noiosa nella migliore delle ipotesi.
Cambiare implementazioni più facilmente importando. Una volta che hai imparato a importare classi e interfacce da altri spazi dei nomi, puoi cambiare un'implementazione di un'interfaccia con una singola riga di codice.
Il caricamento automatico delle classi è molto più semplice se segui lo standard PSR-4: Autoloader, che richiede almeno uno spazio dei nomi di primo livello.
Per gli sviluppatori nello spazio professionale, acquisirai competenze commerciabili al di là dell'ecosistema WordPress. Ti sarà difficile trovare lavoro di sviluppo PHP se non sai come usare gli spazi dei nomi. Non è un concetto difficile da comprendere, ma nella pratica può esserci una curva di apprendimento per alcuni.
