¡Tengo una idea!
Dominemos los espacios de nombres de PHP...
y hagámoslo en menos de 5 minutos.
Toma un poco de café...
¡vamos! Conoce a Foo: una clase de PHP perfectamente aburrida:
¡Saluda a Foo!
Divertidísimo.
Para instanciar nuestra nueva clase favorita, me desplazaré a otro archivo
y diré - redoble de tambores - $foo = new Foo():
¡Tada! Incluso podemos llamar a un método en ella: $foo->doAwesomeThings():
¿Funcionará?
¡Por supuesto!
Puedo abrir un terminal y ejecutar:
php some-other-file.php ¡Ahora mismo, Foo no tiene un espacio de nombres!
Para que Foo sea más hipster, vamos a arreglar eso.
Encima de la clase, añade, qué tal, namespace Acme\Tools:
Normalmente el espacio de nombres de una clase coincide con su directorio, pero eso no es técnicamente necesario.
¡Esto lo acabo de inventar yo!
¡Enhorabuena!
Nuestro amigo Foo vive ahora en un espacio de nombres.
Poner una clase en un espacio de nombres es muy parecido a poner un archivo en un directorio.
Para referenciarla, utiliza la ruta completa y larga de la clase: Acme\Tools\Foo: igual
que puedes utilizar la ruta absoluta para referenciar un archivo en tu sistema de archivos: Cuando
probamos ahora el script ¡Sigue funcionando! Y...
¡eso sí que es! Los espacios de nombres
son básicamente una forma de... ¡hacer
más largos los nombres de tus clases! Añade
el espacio de nombres... y luego haz
referencia a la clase utilizando el espacio de nombres más el nombre de la clase. Eso es
todo. Pero...
¡tener estos largos nombres de clase justo en medio de tu código es un fastidio! Para
solucionarlo, los espacios de nombres de PHP tienen otra cosa especial: la declaración use. Al
principio del archivo, añade use Acme\Tools\Foo as SomeFooClass: Esto
crea una especie
de... "acceso directo". En
cualquier
otro lugar de este archivo, ahora podemos escribir simplemente SomeClassFoo: y PHP sabrá que
realmente nos estamos refiriendo al nombre largo de la clase: Acme\Tools\Foo. O...
si omites la parte as, PHP asumirá que quieres que este alias sea Foo. Así es
como suele quedar el código: Así,
los espacios de nombres hacen que los nombres de las clases sean más largos... y
las sentenciasuse nos permiten crear atajos para poder utilizar el nombre "corto" en nuestro código. En
el código PHP moderno, casi todas las clases con las que trates vivirán en un espacio de nombres... excepto las clases del núcleo de PHP.
Sí, las clases principales de PHP
no viven en un espacio de nombres... lo que
significa que viven en el espacio de nombres "raíz", como
un archivo en la raíz de tu sistema de archivos:
Juguemos con el objeto del núcleo DateTime: $dt = new DateTime() y
luego echo $dt->getTimestamp() con un salto de línea: Cuando
ejecutamos el script: ¡Funciona perfectamente! Pero...
ahora mueve ese mismo código al método doAwsomeThings dentro de nuestro amigo Foo: Ahora
prueba el código: ¡Ah!
¡Explota! ¡ Y comprueba
este error! Clase
Acme\Tools\DateTime no encontrada El nombre real de la clase debería ser simplemente DateTime. Entonces,
¿por qué PHP cree que es Acme\Tools\DateTime? ¡ Porque
los espacios de nombres funcionan como los directorios ! Foo
vive en Acme\Tools. Cuando
decimos simplemente DateTime, es lo mismo que buscar
un archivo DateTime dentro de un directorio Acme/Tools:
Hay dos formas de solucionar esto. La
primera es utilizar el nombre de clase "completamente cualificado". Así,
\DateTime : Sí...
eso funciona igual que un sistema de archivos. O...
puedes utilizar DateTime... y luego
eliminar el \ de abajo:
En realidad es lo mismo: no hay \ al principio de
una declaración use, pero debes fingir que lo hay. Esto
hace que DateTime pase a ser \DateTime. Y...
¡hemos terminado! Los espacios de nombres
hacen que los nombres de tus clases sean más largos, las sentencias de uso te permiten crear "atajos"
para que puedas utilizar nombres cortos en tu código y todo el sistema
funciona exactamente igual que los archivos dentro de los directorios.
¡Diviértete!