Spazi dei nomi PHP in WordPress: una guida senza fronzoli
Pubblicato: 2018-10-16Gli spazi dei nomi PHP hanno quasi dieci anni. Sì, è passato un decennio (e sì, stai invecchiando). Nonostante sia passato un decennio da quando PHP v5.3 è stato rilasciato, molti sviluppatori non hanno ancora una conoscenza di base degli spazi dei nomi. A dire il vero, WordPress non utilizza gli spazi dei nomi , quindi " non è necessario sapere come utilizzare gli spazi dei nomi se lavori solo con WordPress ". Non è necessario essere un ninja dello spazio dei nomi, ma capire le basi è semplice e ti fa bene.
Gli spazi dei nomi PHP esistono da un decennio e ancora non li usi perché nemmeno #wordpress lo fa? Leggi e inizia a usarli in 2 minuti! #sviluppo
CLICCA PER TWEETQuando non c'è il supporto per lo spazio dei nomi, usa un prefisso
Per molto, molto tempo PHP non ha avuto il supporto per lo spazio dei nomi nativo. Ecco perché WordPress e molte altre grandi basi di codice non utilizzano gli spazi dei nomi nativi. Non erano disponibili quando necessario, quindi vengono utilizzati i prefissi.
Lo spazio dei nomi è importante perché assicura che la tua funzione write_to_log()
non sia già stata definita da un altro pezzo di codice. Per evitare conflitti di nome, tutto nell'ambito globale ha bisogno di un prefisso in modo che la funzione diventi awesome_project_write_to_log()
e anche tutte le altre funzioni e variabili ottengano il prefisso awesome_project_
. Semplice? È! Bella? Non esattamente.
Ci sono alcune alternative a questo approccio come l'incapsulamento dei metodi statici. Avvolgi tutte le tue funzioni in una classe e le dichiari come metodi statici. Quindi, invece di chiamare my_function()
, chiami My_Class::my_function()
. Meglio? Un po', ma ancora non corretto namespace.
Vediamo come lo spazio dei nomi consente a più pezzi di codice (o pacchetti, se lo si desidera) di utilizzare gli stessi nomi di classi e funzioni senza conflitti. O come dice il manuale PHP, come abilitano l'incapsulamento del codice. Anche la loro analogia con file e cartelle è perfetta: in molti modi gli spazi dei nomi si comportano proprio come le cartelle, quindi copierò/incollerò dal manuale;
In qualsiasi sistema operativo, le directory servono per raggruppare file correlati e fungono da spazio dei nomi per i file al loro interno. Ad esempio, 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. Per accedere al file foo.txt al di fuori della directory /home/greg, dobbiamo anteporre il nome completo della directory al nome del file utilizzando il separatore di directory per ottenere /home/greg/foo.txt.
Dichiarare gli spazi dei nomi: ricorda la prima riga
Lo namespace
delle parole chiave deve essere la prima riga di codice nel file (senza contare i commenti e qualsiasi contenuto non PHP). I namespace interessano solo classi, interfacce, funzioni e costanti. Non influiscono sulle variabili. È possibile definire lo stesso spazio dei nomi in più file consentendo di dividere il codice in più file. I sottospazi dei nomi consentono di definire una gerarchia negli spazi dei nomi in modo molto simile alle cartelle utilizzando una barra rovesciata – namespace myproject\level1\level2
. Queste sono regole di base e quasi tutte per la dichiarazione degli spazi dei nomi.
// file-A.php contains a function under the myCompany\PackageA namespace namespace myCompany\PackageA; function do_something() { // do things }
// file-B.php contains a function with the same name // but under a different namespace namespace myCompany\PackageB; function do_something() { // do things }
Sebbene possibile, consiglio vivamente di non combinare più spazi dei nomi in un unico file. Credimi, prima o poi ti dimenticherai di averlo fatto e quindi il debug di un bug di 2 minuti richiede due ore. Tuttavia, se proprio devi, ecco la sintassi.

// do not put multiple namespace declarations into the same file // but if you must, here's the syntax namespace MyFirstProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } namespace MySecondProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } // any code after this has to go in the global namespace namespace { $some_var = 1; function_in_global_namespace(); }
Utilizzo degli spazi dei nomi: ricorda le cartelle
Come ho già detto, gli spazi dei nomi sono estremamente simili alle cartelle. Supponendo che il file foo.txt
sia nella tua cartella corrente; puoi fare riferimento ad esso con un semplice foo.txt
. Se sei un livello sopra la cartella con il file foo.txt
, devi usare un percorso relativo ../foo.txt
o uno assoluto /folder1/folder2/foo.txt
. Nulla di bello. I namespace usano lo stesso paradigma.
// remember after declaring a namespace // all our code is in it; like when you're working in a folder namespace mycompany\project; function foo() {} class foo { static function staticmethod() {} } // resolves to mycompany\project\foo() because of line #3 foo(); // likewise, resolves to mycompany\project\foo::staticmethod() foo::staticmethod(); // constant are affected by namespaces too // so we're working with mycompany\project\FOO echo FOO; // this is a relative path // resolves to mycompany\project\subnamespace\foo() subnamespace\foo(); // static methods are no different // mycompany\project\subnamespace\foo::staticmethod() subnamespace\foo::staticmethod(); // a full namespace path starts with a backslash // it resolves exactly to what it says it does \otherNamespace\Bar\foo(); // again same thing for a constant, full path nothing magical echo \otherNamespace\Bar\FOO;
Dai un'occhiata alla parola chiave use
nel manuale PHP: gli esempi sono fantastici. Fornisce un modo per importare codice da altri spazi dei nomi PHP nello spazio dei nomi corrente o per fare riferimento a un nome esterno (completamente qualificato) con un alias.
Sì, hai bisogno di spazi dei nomi e dovresti usarli
Come è più che evidente osservando il sorgente di WordPress, non è necessario utilizzare gli spazi dei nomi, ma è necessario utilizzare un metodo di spaziatura dei nomi. Prefisso con wp_
nel caso di WP. Quindi, se lo stiamo già facendo, perché non farlo correttamente?
Gli spazi dei nomi in PHP si integrano facilmente in qualsiasi flusso di lavoro di sviluppo. Facilitano il caricamento automatico, la denominazione dei file e in generale rendono il codice più pulito. Il refactoring del vecchio codice non è mai un'attività popolare (indipendentemente dal linguaggio di codifica), quindi non ti dirò di andare avanti e refactoring di un progetto funzionante da 2 MB solo per poter dire di utilizzare gli spazi dei nomi. Tuttavia, insisterò sull'utilizzo degli spazi dei nomi quando si lavora su nuovi progetti. Ti ringrazierai abbastanza presto.
La documentazione ufficiale di PHP sugli spazi dei nomi è più che eccellente! I campioni di codice sono puliti e i commenti sono utili nel mondo reale. Assicurati di sfogliarlo, anche se non ritieni necessario.