Pro e contro di spazi dei nomi vs includere / richiedere in PHP?


20

Di recente ho iniziato a utilizzare gli spazi dei nomi in PHP. Quando li ho visti per la prima volta, ho pensato che la loro sintassi fosse brutta e non li avrei mai usati. Tuttavia, ho creato un caricatore automatico (spl_autoload_register) che lo rende tale da non dover più scrivere un'istruzione include / request.

Mi piacciono gli spazi dei nomi, ma c'è qualche vantaggio oggettivo rispetto alle istruzioni include / request o sono esattamente lo stesso metodo per raggiungere lo stesso obiettivo?


1
Gli spazi dei nomi impediscono le collisioni con librerie di terze parti.
Reactgular,

1
In questo momento il vantaggio principale per me per quanto riguarda gli spazi dei nomi è il caricamento automatico. Ad esempio, uso in linea new \Vendor\Namespace\Class()senza una dichiarazione obbligatoria prima nel metodo o nella classe.
NobleUplift,

3
Molte librerie PHP usano il caricamento automatico senza spazi dei nomi. PHP dovrebbe rendere obbligatori gli spazi dei nomi.
Reactgular,

Nessuna discussione da parte mia. Mi piacerebbe vedere tutte queste modifiche elencate qui .
NobleUplift,

Risposte:


21

Gli spazi dei nomi non sono solo per le classi di caricamento automatico. Inoltre impediscono i conflitti di denominazione. In effetti, questo è il loro scopo principale.

Supponi di avere un progetto che ha bisogno di una classe chiamata User, per memorizzare informazioni sugli utenti della tua applicazione, ma un plugin usa anche una (diversa) classe chiamata Userper memorizzare informazioni. Gli spazi dei nomi ti consentono di creare la tua classe all'interno di uno spazio dei nomi (diciamo, MyApp) e lascia che il plugin usi un altro spazio dei nomi (diciamo, CoolPlugin). Il codice all'interno dello MyAppspazio può semplicemente fare riferimento a User(ad esempio, new User();), così come il codice nello CoolPluginspazio; ognuno otterrà il risultato atteso. Quando è necessario utilizzare il codice da un altro spazio dei nomi, è sufficiente prefissarlo. Ad esempio, il codice nello CoolPluginspazio può accedere alla Userclasse in MyAppvianew \MyApp\User();

L'alternativa è che ogni classe ha bisogno di un nome complesso ovunque , come class MyApp_Usere class CoolPlugin_User. Gli spazi dei nomi consentono di semplificare le cose la maggior parte delle volte ed evitare conflitti di denominazione in ogni momento.

Modifica: per rispondere alla domanda "C'è qualche differenza di prestazioni tra i due?"

Non significativo, no. Non l'ho confrontato, ma probabilmente c'è una differenza a livello di nanosecondi. Detto questo, sacrificare la qualità del codice per piccole prestazioni non è una buona strategia, quindi dovresti usare gli spazi dei nomi a prescindere. Per parametri di riferimento di tipi simili di problemi, consultare PHPbench.com e questa risposta StackOverflow .

Il tuo codice deve essere incredibilmente stretto e incredibilmente sensibile al tempo (pensa al trading ad alta frequenza o gestisci le reazioni nucleari) prima di doverti preoccupare di micro-ottimizzarlo in questo tipo di contesto. Se è veramente sensibile al tempo, dovresti probabilmente scrivere codice in o persino , non linguaggi interpretati come PHP.


1
+1 Ho semplicemente notato che ogni progetto inizia a sembrare che non potrebbe aver bisogno di spazi dei nomi, e poi cresce facilmente al punto che diventa ridicolo hackerare le cose per lavorare senza di esse. Non avere spazi dei nomi è praticamente lo stesso che dichiarare ogni variabile globale, applicata alle classi. Su basi di codice più grandi o su quelle che fanno un uso liberale delle librerie, diventa un casino totale.
BrianH,

1
Si prega di vedere la mia modifica sopra.
elixenide,

2
Ho già detto che sto realizzando un'interfaccia PHP per Large Hadron Collider? Altrimenti, credo che questa risposta sia sufficiente, grazie.
NobleUplift,

1
Per favore, non creare stelle di quark o buchi neri! Felice di aiutare.
elixenide,

1
Non ti preoccupare, solo Strangelets. Stiamo creando cannoni adronici. Voglio dire, qualcosa di scientifico e non di armi.
NobleUplift,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.