¿Cómo agrego parcialmente el espacio de nombres PHP a una biblioteca sin romper el código existente?

10

Mi empresa ha creado un marco PHP modular a lo largo de los años, comenzando mucho antes de que PHP 5.3 agregara espacios de nombres. Recientemente, decidimos comenzar a usar espacios de nombres en el nuevo código de nuestra biblioteca, y tenemos la intención de eventualmente espaciar el nombre del código antiguo. Sin embargo, tenemos algunos problemas que estamos tratando de resolver para determinar si agregar espacios de nombres a una base de código anterior a la v5.3 no es una buena idea:

  1. ¿Puedo asignar un espacio de nombres a una clase pero también importar (usar) el espacio de nombres global para que todas las clases globales no necesiten un \prefijo?
  2. Si asignamos un espacio de nombres a una clase existente en nuestra biblioteca, ¿cómo podemos evitar que todos los proyectos existentes se rompan tan pronto como se actualice el marco? Por ejemplo, ¿puede la biblioteca cambiar el nombre de la clase ThemeEnginea \module\theme\ThemeEngine, pero los sitios web existentes llaman ThemeEnginesin ninguna modificación de código? Si es así, ¿cómo se vería ese código?
pobre
fuente

Respuestas:

2
  1. No se puede 'usar' espacios de nombres, lamentablemente, solo clases: http://www.php.net/manual/en/language.namespaces.importing.php . Editar: puede importar clases desde el espacio de nombres global, como lo hicieron con ArrayObject en uno de los ejemplos.

  2. Podría tener una sección global de instrucciones de uso para que todas las clases preexistentes, que también se encuentran en el espacio de nombres global, en teoría deberían encontrar las clases perfectamente. Teóricamente ...

Estamos en el mismo barco que tú, más o menos. Tenemos un código antiguo que no usa espacios de nombres, pero sí usa el _ falsificador de espacio de nombres (como Zend_Db_Table ...) y tenemos un código más antiguo que ni siquiera falsifica espacios de nombres. Probablemente vamos a tomar la misma ruta, pero aún tenemos que probar si es posible. ¡Buena suerte!

Pelshoff
fuente
1

Sí, lo que hice al final fue usar - 'usar' para importar las clases individuales que necesitaba

por ejemplo, en lugar de agregar '/' delante de todo como:

\DateTime()

Agregué debajo de mi espacio de nombres

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
Stevanicus
fuente