Come aggiungo parzialmente il namespacing PHP a una libreria senza rompere il codice esistente?

10

La mia azienda ha creato un framework PHP modulare nel corso degli anni, iniziando molto prima che PHP 5.3 aggiungesse spazi dei nomi. Recentemente, abbiamo deciso di iniziare a utilizzare gli spazi dei nomi nel nuovo codice della nostra biblioteca e, alla fine, intendiamo suddividere il vecchio codice. Tuttavia, abbiamo alcuni problemi che stiamo cercando di capire se aggiungere spazi dei nomi a una base di codice pre-v5.3 non è una buona idea:

  1. Posso assegnare uno spazio ai nomi a una classe ma anche importare (utilizzare) lo spazio dei nomi globale in modo che tutte le classi globali non abbiano bisogno di un prefisso \ ?
  2. Se assegniamo spazio dei nomi a una classe esistente nella nostra libreria, come possiamo evitare che tutti i progetti esistenti si interrompano non appena il framework si aggiorna? Ad esempio, la libreria può cambiare il nome della classe ThemeEngine in \module\theme\ThemeEngine , ma i siti web esistenti chiamano ThemeEngine senza qualsiasi modifica del codice? In tal caso, come sarebbe il codice?
posta jimp 16.08.2011 - 23:06
fonte

2 risposte

2
  1. Non puoi affatto usare "namespace", purtroppo solo le classi: link . Modifica: puoi importare classi dallo spazio dei nomi globale, come hanno fatto con ArrayObject in uno degli esempi.

  2. Potresti avere una sezione globale delle istruzioni use in modo che tutte le classi preesistenti, che sono nello spazio dei nomi globale, teoricamente, dovrebbero trovare le classi giuste. In teoria ...

Siamo nella stessa barca di te, una specie di. Abbiamo un vecchio codice che non usa gli spazi dei nomi, ma usa il faker _ namespace (come Zend_Db_Table ...) e abbiamo un codice più vecchio che non simula nemmeno gli spazi dei nomi. Probabilmente faremo la stessa strada, ma dobbiamo ancora testare se è possibile. Buona fortuna!

    
risposta data 16.08.2011 - 23:14
fonte
1

Sì, quello che ho fatto alla fine è stato utilizzare - "usa" per importare le singole classi di cui avevo bisogno

per esempio invece di aggiungere '/' davanti a tutto come:

\DateTime()

Ho aggiunto sotto il mio spazio dei nomi

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
    
risposta data 16.05.2012 - 21:22
fonte

Leggi altre domande sui tag