Namespacing in PHP

E 'stata una corsa sconnessa, per quanto riguarda il supporto per lo spazio dei nomi in PHP. Fortunatamente, è stato aggiunto al linguaggio in PHP 5.3 e la struttura applicabile del codice PHP è migliorata notevolmente da allora. Ma esattamente come li usiamo?


Cos'è un Namespace?

"Non dimenticare di sfuggire al backslash quando memorizzi un nome di spazio dei nomi in una stringa!"

Immagina un namespace come un cassetto in cui puoi mettere ogni genere di cose: una matita, un righello, un pezzo di carta e così via. Queste sono le tue cose. Direttamente sotto il tuo cassetto c'è quello di qualcun altro, e ci mette le stesse cose. Per evitare di utilizzare gli articoli degli altri, decidi di etichettare i cassetti in modo che sia chiaro cosa appartiene a chi.

In precedenza, gli sviluppatori dovevano utilizzare i caratteri di sottolineatura nelle loro classi, funzioni e costanti per separare le basi di codice. Questo equivale a etichettare gli altri oggetti e metterli in un unico grande cassetto. Certo, è almeno una specie di organizzazione, ma è molto inefficiente.

Namespacing in the rescue! È possibile dichiarare la stessa funzione, classe, interfaccia e definizioni costanti in spazi dei nomi separati senza ricevere errori irreversibili. Essentialy, uno spazio dei nomi non è altro che un blocco di codice etichettato gerarchicamente con codice PHP regolare.

Li stai usando!

È importante tenere presente che si fa indirettamente uso dei namespace; A partire da PHP 5.3, tutte le definizioni che non sono ancora state dichiarate in uno spazio dei nomi definito dall'utente rientrano nello spazio dei nomi globale.

Lo spazio dei nomi globale contiene anche tutte le definizioni PHP interne, come eco(), mysqli_connect (), e il Eccezione classe. Perché il namespace globale non ha un nome identificativo univoco, il suo più spesso definito come il spazio globale.

Si noti che non è un obbligo utilizzare il namespace.

Lo script PHP funzionerà perfettamente senza di loro e questo comportamento non cambierà molto presto.


Definizione di uno spazio dei nomi

Una definizione di spazio dei nomi è la prima dichiarazione che l'interprete di PHP dovrebbe incontrare in un file PHP. L'unica istruzione consentita per verificarsi sopra una dichiarazione dello spazio dei nomi è a dichiarare dichiarazione, e poi ancora, solo se dichiara la codifica dello script.

Dichiarare uno spazio dei nomi è semplice come usare il namespace parola chiave. Un nome di spazio dei nomi dovrebbe rispettare le stesse regole degli altri identificatori in PHP. Pertanto, un namespace deve inizia con una lettera o un trattino basso, seguito da un numero qualsiasi di lettere, numeri o caratteri di sottolineatura.

 

Se si desidera assegnare un blocco di codice allo spazio globale, si utilizza il namespace parola chiave senza aggiungere un nome.

 

È consentito avere più spazi dei nomi nello stesso file.

 

Puoi anche disperdere lo stesso spazio dei nomi in diversi file; il processo di inclusione dei file li unisce automaticamente. Pertanto, è una buona pratica di codifica limitare la quantità di definizioni di spazio dei nomi a una per file, proprio come faresti con le classi.

Il namespace viene utilizzato per evitare definizioni contrastanti e introdurre maggiore flessibilità e organizzazione nella base di codice.

Si noti che le parentesi che circondano il blocco di codice del namespace sono completamente opzionali. In effetti, attenersi alla regola one-namespace per file e omettere le parentesi graffe rende il codice molto più pulito: non è necessario indentare il codice annidato.

Sub-namespace

I namespace possono seguire una certa gerarchia, proprio come le directory nel file system del tuo computer. Gli spazi secondari sono estremamente utili per organizzare la struttura di un progetto. Ad esempio, se il progetto richiede l'accesso al database, è possibile che si desideri inserire tutto il codice relativo al database, ad esempio un'eccezione del database e un gestore di connessione, in un sottospazio denominato Banca dati.

Per mantenere la flessibilità, è consigliabile memorizzare sotto-namespace nelle sottodirectory. Questo incoraggia la strutturazione del tuo progetto e rende molto più semplice l'uso di autoloader che seguono lo standard PSR-0.

PHP usa il backslash come suo separatore di spazi dei nomi.


Fatto divertente: nella RFC per decidere quale separatore di spazi dei nomi dovrebbe essere usato, hanno anche considerato l'utilizzo di una faccina.
// myproject / database / connection.php  

Puoi avere tanti sottomenu come vuoi.

 

La definizione di sub-namespace con blocchi di codice annidati non è supportata. Il seguente esempio genererà un errore fatale molto descrittivo: "Le dichiarazioni di spazio dei nomi non possono essere nidificate".

 

Chiamare codice da un namespace

Se si desidera creare un'istanza di un nuovo oggetto, chiamare una funzione o utilizzare una costante da un diverso spazio dei nomi, si utilizza la notazione backslash. Possono essere risolti da tre diversi punti di vista:

  • Nome non qualificato
  • Nome qualificato
  • Nome completo

Nome non qualificato

Questo è il nome di una classe, funzione o costante senza includere un riferimento a qualsiasi spazio dei nomi. Se sei nuovo nel namespace, questo è il punto di vista dal quale sei abituato a lavorare.

 

Nome qualificato

Questo è il modo in cui accediamo alla gerarchia dello spazio dei nomi secondari; si avvale della notazione backslash.

 

L'esempio seguente genera un errore irreversibile: "Errore irreversibile: Classe" MyProject \ Database \ MyProject \ FileAccess \ Input "non trovato" perché MyProject \ FileAccess \ Input si avvicina relativamente allo spazio dei nomi in cui ci si trova attualmente.

 

Nome completo

I nomi non qualificati e qualificati sono entrambi relativi allo spazio dei nomi in cui ci si trova attualmente. Possono essere utilizzati solo per accedere a definizioni di quel livello o per approfondire la gerarchia dello spazio dei nomi.

Se si desidera accedere a una funzione, classe o costante che si trova a un livello superiore nella gerarchia, è necessario utilizzare il nome completo: un percorso assoluto anziché relativo. Questo si riduce a prepensionare la vostra chiamata con una barra rovesciata. Ciò consente al PHP di sapere che questa chiamata dovrebbe essere risolta dallo spazio globale invece di affrontarla relativamente.

 

Non è necessario utilizzare il nome completo delle funzioni PHP interne. Chiamare un nome non qualificato per una costante o funzione che non esiste nello spazio dei nomi al momento stai lavorando nei risultati in PHP per cercare lo spazio dei nomi globale per loro. Questo è un fallback incorporato che non si applica ai nomi di classe non qualificati.

Con questo in mente, possiamo ora sovraccaricare le funzioni PHP interne pur essendo in grado di chiamare la funzione originale (o costante per quella materia).

'; 

Chiamate dinamiche

PHP è un linguaggio di programmazione dinamico; quindi è anche possibile applicare questa funzionalità per chiamare il codice di namespace. Questo è essenzialmente lo stesso dell'istanziazione di classi variabili o includendo file variabili. Il separatore di spazi dei nomi utilizzato da PHP è anche un meta-carattere nelle stringhe. Non dimenticare di sfuggire alla barra inversa quando si memorizza un nome di spazio dei nomi in una stringa!

 

Il namespace Parola chiave

Non solo è il namespace parola chiave utilizzata per definire uno spazio dei nomi, può anche essere utilizzata per risolvere esplicitamente lo spazio dei nomi corrente, funzionalmente simile al se stesso parola chiave per le classi.

 

Il __NAMESPACE__ costante

Molto simile al se stesso la parola chiave non può essere utilizzata per determinare qual è il nome della classe corrente, il namespace la parola chiave non può essere utilizzata per determinare quale sia lo spazio dei nomi corrente. Questo è il motivo per cui abbiamo il __NAMESPACE__ costante.

 

Questa costante è molto utile per l'apprendimento se stai iniziando con i namespace; è anche utile per il debug. Essendo una stringa, può anche essere utilizzato in combinazione con chiamate di codice dinamiche di cui abbiamo discusso in precedenza.


Alias ​​o importazione

"non è un obbligo utilizzare il namespace"

Namespacing in PHP ha il supporto per importazione. L'importazione viene anche definita come aliasing. Solo classi, interfacce e spazi dei nomi possono essere sottoposti a un alias o importati.

L'importazione è un aspetto molto utile e fondamentale del namespace. Ti dà la possibilità di utilizzare pacchetti di codice esterni, come le librerie, senza doversi preoccupare di nomi in conflitto. L'importazione si ottiene usando il uso parola chiave. Facoltativamente, puoi specificare un alias personalizzato con come parola chiave.

usa [nome di classe, interfaccia o spazio dei nomi] come [optional_alcuni_personalizzati]

Come è fatto

Un nome completo può essere sostituito da un nome non completo più breve in modo che non sia necessario scrivere il nome completo ogni volta che si desidera utilizzarlo. L'aliasing o l'importazione dovrebbero avvenire nell'ambito più alto di uno spazio dei nomi o nell'ambito globale. Cercare di farlo nell'ambito di un metodo o funzione è una sintassi non valida.

 

In alternativa, puoi assegnargli un nome diverso:

 

Ti è anche permesso di importare classi globali, come la Eccezione classe. Quando viene importato, non è più necessario scrivere il suo nome completo.

Si noti che i nomi delle importazioni non vengono risolti come relativi al namespace corrente ma da un punto di vista assoluto, a partire dallo spazio globale. Ciò significa che una barra inversa non è necessaria e non è raccomandata.

 

Sebbene sia possibile richiamare dinamicamente il codice dei nomi, l'importazione dinamica non è supportata.

 

Conclusione

Il namespace viene utilizzato per evitare definizioni contrastanti e introdurre maggiore flessibilità e organizzazione nella base di codice. Ricorda che non sei obbligato a usare il namespace; è una funzionalità utilizzata in combinazione con un flusso di lavoro orientato agli oggetti. Si spera, tuttavia, che prendiate in considerazione l'idea di portare il vostro (futuro) progetto PHP al livello successivo facendo uso di namespacing. Hai ancora deciso?