DevTips – Spazi dei nomi in PHP

Pubblicato: 2020-03-06

Circa un anno fa WordPress ha deciso di aggiornare la versione PHP minima richiesta, dalla 5.2 (utilizzata dal 2010) a qualcosa di più aggiornato. Infatti, oggi la versione minima di PHP consigliata da WordPress è una delle più recenti: PHP 7.3.

Se sei un semplice utente di WordPress, questo probabilmente non avrà un impatto su di te (oltre al fatto che queste nuove versioni offrono prestazioni migliori).

Ma se sei uno sviluppatore, queste nuove versioni di PHP hanno alcune fantastiche funzionalità che puoi utilizzare nei tuoi plugin e temi. E oggi, nello specifico, vorrei parlarvi di uno che è con noi da molto tempo ma: i namespace.

WordPress e prefissi di codice

Una delle prime regole che impari come sviluppatore di WordPress è "usare i prefissi in tutto ciò che facciamo" per evitare "collisioni di nomi". Come possiamo leggere nelle migliori pratiche di WordPress:

Una collisione di nomi si verifica quando il tuo plug-in utilizza lo stesso nome per una variabile, una funzione o una classe di un altro plug-in.

[Per evitare collisioni di nomi], tutte le variabili, le funzioni e le classi devono essere precedute da un identificatore univoco. I prefissi impediscono ad altri plugin di sovrascrivere le tue variabili e chiamare accidentalmente le tue funzioni e classi. Ti impedirà anche di fare lo stesso.

Migliori pratiche per lo sviluppo di plugin per WordPress

Quindi, ad esempio, invece di creare una funzione come get_site_id , è meglio nominarla nelio_content_get_site_id . In questo modo siamo in grado di identificare rapidamente il plugin ( nelio_content ) o il tema a cui appartiene una determinata funzione ( get_site_id ) ed evitare errori fatali se più plugin tentano di definire la stessa funzione.

L'uso dei prefissi è un modo rudimentale per creare uno "spazio dei nomi"; una soluzione alternativa che dovevamo implementare quando non avevamo un'alternativa migliore. Tutti gli elementi che utilizzano lo stesso prefisso fanno parte dello stesso set o spazio dei nomi. Ma ciò si traduce in un codice inutilmente più complesso: i nomi sono più lunghi a causa di prefissi che non hanno altro scopo che l'emulazione degli spazi dei nomi.

Spazi dei nomi PHP

PHP versione 5.3 ha introdotto il concetto di namespace . La definizione che ne danno nella documentazione mi sembra ottima, quindi la ripropongo qui:

Nella definizione più ampia, gli spazi dei nomi sono un modo per incapsulare gli elementi. Questo può essere visto come un concetto astratto in molti luoghi. Ad esempio, in qualsiasi sistema operativo le directory servono a raggruppare file correlati e fungono da spazio dei nomi per i file al loro interno. Come esempio concreto, il file foo.txt può esistere sia nella directory /home/greg che in /home/other , ma due copie di foo.txt non possono coesistere nella stessa directory.

Nel mondo PHP, gli spazi dei nomi sono progettati per risolvere due problemi che gli autori di librerie e applicazioni incontrano durante la creazione di elementi di codice riutilizzabili come classi o funzioni:

1. Nomi collisioni tra codice creato e codice PHP interno o codice di terze parti.

2. Possibilità di alias (o abbreviare) Extra_Long_Names , migliorando la leggibilità del codice sorgente.

documenti PHP

Come creare uno spazio dei nomi

Creare uno spazio dei nomi in PHP è estremamente semplice. All'inizio del file PHP che crei, aggiungi una direttiva namespace con il nome che vuoi usare e "tutto" che definisci in quel file apparterrà a quel namespace:

 <?php namespace Nelio_Content;

Sì, è così semplice! Ora "tutto" che creiamo sarà nello spazio dei nomi Nelio_Content . Ad esempio, se definisco una funzione come quella che ho citato all'inizio:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

ora sappiamo che get_site_id è all'interno dello spazio dei nomi Nelio_Content . In questo modo, non dobbiamo più utilizzare il prefisso nelio_content_ quando si definisce la funzione. Grande!

Eccezioni agli spazi dei nomi

Se osservi da vicino ciò che ti ho detto finora, vedrai che ho scritto "tutto" tra virgolette: "'tutto ciò che aggiungiamo lì apparterrà allo spazio dei nomi specificato". Perché l'ho fatto? Poiché gli spazi dei nomi non si applicano assolutamente a tutto il codice che scriviamo... ci sono alcune eccezioni.

Gli spazi dei nomi PHP coprono solo i seguenti elementi PHP:

  • Classi
  • Interfacce
  • Tratti
  • Funzioni
  • Costanti dichiarate con const ma non con define

Inoltre, ci sono alcune cose aggiuntive in WordPress che richiedono anche i propri spazi dei nomi e, sfortunatamente, gli spazi dei nomi PHP non coprono: i tuoi script handle , le opzioni del database o i tipi di contenuto personalizzati e i relativi metadati, ecc. In tutti questi casi, è necessario continuare a utilizzare i prefissi.

Come importare elementi da uno spazio dei nomi all'altro

Se devi usare un elemento che si trova nel tuo spazio dei nomi, non devi fare nulla di speciale: chiamalo semplicemente con il suo nome. Ad esempio, nel frammento di codice seguente:

 <?php namespace Nelio_Content; function get_site_id() { // ... } function get_auth_token() { $site_id = get_site_id(); // ... }

Puoi vedere che abbiamo definito due funzioni: get_site_id e get_auth_token , entrambe all'interno dello spazio dei nomi Nelio_Content . Quando get_auth_token deve usare get_site_id , lo chiama semplicemente come al solito.

Se, invece, devi usare get_site_id in uno spazio dei nomi diverso, devi chiamare la funzione usando il suo identificatore completo:

 <?php namespace Something_Else; function do_some_action() { $site_id = Nelio_Content\get_site_id(); // ... }

oppure devi importare la funzione con la parola chiave use :

 <?php namespace Something_Else; use Nelio_Content\get_site_id; function do_some_action() { $site_id = get_site_id(); // ... }

Personalmente mi piace molto la seconda opzione: usando la parola chiave use per importare funzioni da altri namespace, puoi dare una rapida occhiata all'intestazione del tuo file e identificarne le dipendenze.

Filtri e azioni di WordPress con spazi dei nomi PHP

C'è un dettaglio importante che dovresti tenere a mente quando usi gli spazi dei nomi accanto ai filtri e alle azioni di WordPress. Quando specifichi i callback di filtri e azioni, di solito lo fai dando il nome del callback come una stringa:

 <?php // ... add_action( 'init', 'do_some_action' );

Il problema è che se questa funzione è all'interno di uno spazio dei nomi, l'hook precedente non funzionerà come previsto; devi dire a WordPress il nome completo della funzione. In altre parole, devi includere il suo spazio dei nomi (se ne ha uno).

Stai aggiungendo l'hook nel file in cui definisci lo spazio dei nomi stesso? Non importa, usa il nome completo:

 <?php namespace Nelio_Content; function do_some_action() { // ... } add_action( 'init', 'Nelio_Content\do_some_action' );

Sei in un altro spazio dei nomi ma hai importato la funzione con use ? Non importa neanche, usa il nome completo:

 <?php namespace Something_Else; use Nelio_Content\do_some_action; // ... add_action( 'init', 'Nelio_Content\do_some_action' );

Utilizzo di alias con i nostri namespace

Un'altra funzionalità molto interessante dei namespace è l'alias. Immagina il seguente scenario:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

Se voglio usare questa funzione in un altro spazio dei nomi, abbiamo già visto che posso farlo con use . Ma come userei questa funzione se il modulo in cui voglio usarlo ha già una funzione chiamata get_site_id ?

Bene, fortunatamente per me, possiamo alias le nostre importazioni in nuovi nomi:

 <?php namespace Something_Else; use Nelio_Content\get_site_id as get_nc_site_id(); function get_site_id() { // ... } function do_some_action() { $nc_site_idd = get_nc_site_id(); // ... }

Inizia a usare gli spazi dei nomi oggi stesso!

I namespace sono uno strumento fantastico per evitare collisioni di nomi e per organizzare il nostro codice. In effetti, e anche se non ho commentato questo post, ci sono standard come PSR-4 che consentono a PHP di caricare automaticamente le classi in base alla struttura degli spazi dei nomi che usi e al modo in cui organizzi il codice in directory e file.

Se non stai ancora utilizzando gli spazi dei nomi nei tuoi progetti, ti consigliamo di iniziare a farlo d'ora in poi. Raccontaci la tua esperienza nei commenti!

Immagine in primo piano di Chaitanya Tvs su Unsplash.