Come faccio ad aggiungere parzialmente lo spazio dei nomi 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. Di recente, abbiamo deciso di iniziare a utilizzare gli spazi dei nomi nel nuovo codice della nostra libreria e alla fine intendiamo spaziare il vecchio codice. Tuttavia, abbiamo alcuni problemi che stiamo cercando di risolvere per determinare se l'aggiunta di spazi dei nomi a una base di codice precedente alla v5.3 non è una buona idea:

  1. Posso inserire uno spazio dei nomi in una classe ma anche importare (usare) lo spazio dei nomi globale in modo che tutte le classi globali non abbiano bisogno di un \prefisso?
  2. Se assegniamo uno spazio a una classe esistente nella nostra libreria, come possiamo evitare che tutti i progetti esistenti vengano interrotti non appena l'aggiornamento del framework? Ad esempio, la libreria può cambiare il nome della classe ThemeEnginein \module\theme\ThemeEngine, ma i siti Web esistenti chiamano ThemeEnginesenza alcuna modifica del codice? In tal caso, come sarebbe quel codice?

Risposte:


2
  1. Purtroppo non è possibile "utilizzare" gli spazi dei nomi, solo le classi: http://www.php.net/manual/en/language.namespaces.importing.php . Modifica: è possibile importare classi dallo spazio dei nomi globale, come hanno fatto con ArrayObject in uno degli esempi.

  2. Potresti avere una sezione globale di istruzioni d'uso in modo che tutte le classi preesistenti, che si trovano anche nello spazio dei nomi globale, teoricamente trovino che le classi vadano bene. In teoria ...

Siamo nella stessa barca come te. Abbiamo del 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 finge nemmeno gli spazi dei nomi. Probabilmente seguiremo lo stesso percorso, ma dobbiamo ancora verificare se è possibile. In bocca al lupo!


1

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

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

\DateTime()

Ho aggiunto sotto il mio spazio dei nomi

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
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.