Unas de las características nuevas más importantes en la versión 5.3 de PHP es la posibilidad de utilizar Namespaces (espacios de nombres) los que nos ayudara a evitar colisiones de nombres en nuestro código.
Antes de la inclusión de Namespaces, en PHP no se podía tener dos clases con el mismo nombre, lo que es un inconveniente en proyectos grandes de muchas clases o cuando usamos librerías externas (por ejemplo, si usamos una librería externa que tiene una clase llamada Usuarios, ya no podemos usar ese nombre en todo nuestro proyecto).
Veamos como se define una clase sin namespace (podría pensarse que usa el namespace global también).
<?php class Usuario { //bla bla bla } $nuevousuario = new Usuario();
<?php
Notese el agreado de la directiva «namespace«. Esto le dice a Php que la clase Usuario pertenece al espacio de nombres (namespace) Argentina. O, a la inversa, el namespace
Argentina contiene a la clase Usuario.
Ahora, para llamar a la clase lo haremos de la siguiente forma:
<?php $nuevousuario = new Argentina\Usuario();
Esta es la sintaxis para referirnos a una clase que está dentro de un namespace. Aquí llamamos a la clase Usuario del namespace Argentina.
Otra forma de usar un namespace es declararlo al principio del archivo y luego PHP buscará todas las clases que instanciemos en ese namespace:
<?php namespace Argentina; //definimos que el namespace sera Argentina $usuario = new Usuario() //ahora PHP sabe que esta clase pertenece al namespace Argentina ?>
En este ejemplo es posible que queramos instanciar una clase que está definida en el espacio global (es decir, no fue asignada a ningún namespace en particular), esto se hace anteponiendo \
al nombre de la clase a instanciar:
<?php $usuario = new \Usuario(); ?>
Este código instanciará la clase Usuario definida en el namespace global y no la del namespace Argentina.
Por último, una opción muy cómoda que tienen los namespaces en PHP es la opción de usar alias para organizar mejor el código y no tener que usar la ruta absoluta hacia la clase todo el tiempo, lo que puede ser molesto si trabajamos con muchos namespaces diferentes.
<?php namespace Argentina; //incluimos el namespace Argentina use Uruguay/Usuario as Uruguayo; class Usuario { //esta clase se define en el namespace Argentina! } $usuarioArgentino = new Usuario(); $usuarioUruguayo = new Uruguayo(); ?>
Usando el alias «as» le damos un sobrenombrea la clase Usuario del namespace Uruguay y podemos usarla sin hacer referencia hacia su ruta, lo que nos permite armar un código más limpio y mas entendible si nos acostumbramos a esta forma.
En conclusión, los namespaces en PHP nos ayudan a organizar mejor la estructura de nuestras clases y puede ser muy útil si queremos liberar el código de una librería ya que podríamos armar la estructura de namespaces con nuestro nombre, por ejemplo, y los usuarios nunca van a tener problemas de colisiones de nombres.