Revista Informática

PHP desde Cero: Namespaces

Publicado el 28 febrero 2014 por Codehero @codeheroblog

Si tenemos un proyecto grande y tenemos varias clases que hemos importado o han hecho diferentes personas puede haber una colisión de nombres, pero esto se resuelve con esta característica de PHP. Anteriormente, y en realidad todavía muchas personas lo resuelve de esta manera, se usaban nombres largos para identificar las clases de manera inequívoca y así evitar las colisiones. Digo anteriormente porque los namespaces se implementaron en PHP desde la version 5.3.


Introducción a los Namespaces

Ahora vamos a ver como funcionan y como se aplican los namespaces en PHP. Primero que nada vamos a ver un ejemplo en donde haya colisión de nombre de clases:

class Usuario { var $nombre; } class Usuario{ var $correo; var $clave; }

12345678 classUsuario{  var$nombre;} classUsuario{  var$correo;  var$clave;}

Como podemos ver tenemos dos clases Usuario que tiene funcionalidades diferentes(imaginemos que tienen muchos métodos y propiedades), pero al llamarse de la misma manera va a dar error cuando las llamemos porque PHP no sabe cual queremos instanciar. Ahora vamos a ver las mismas clases pero con unos namespace y como se pueden llamar en el mismo código sin crear colisiones.

namespace usuarioPersona; class Usuario { var $nombre; } namespace usuarioSistema; class Usuario{ var $correo; var $clave; } $persona = new \usuarioPersona\Usuario(); $usu_sistema = new \usuarioSistema\Usuario();

12345678910111213141516 namespaceusuarioPersona; classUsuario{  var$nombre;} namespaceusuarioSistema; classUsuario{  var$correo;  var$clave;} $persona=new\usuarioPersona\Usuario(); $usu_sistema=new\usuarioSistema\Usuario();

Utilizando los namespace se puede ver claramente cuando llamamos a cada una de las clases Usuario.


Sintaxis

Los namespaces se puede declarar, importar y utilizar de varias maneras, las cuales vamos a ver a continuación.

Por defecto todas las clases, funciones y variables están definidas en el entorno global, como ha sido siempre en PHP.

//para declarar un namespace se utiliza la palabra reservada namespace //antes del nombre que se le quiera otorgar //y debe ir al principio del archivo del script namespace nombreDelNamespace; // a partir de aquí se escribe todo el código // que se quiera incluir en este entorno

1234567 //para declarar un namespace se utiliza la palabra reservada namespace//antes del nombre que se le quiera otorgar//y debe ir al principio del archivo del scriptnamespacenombreDelNamespace; // a partir de aquí se escribe todo el código// que se quiera incluir en este entorno

También se pueden definir subnamespaces para poder tener nuestro código bien organizado y estructurado. Para separar los namespaces se utiliza la barra invertida ( \ ), veamos algunos subnamespaces validos.

Proyecto\BD\MySQL Proyecto\BD\Mongo Proyecto\PDF\FilePDF Proyecto\Librerias\LibreriaGraficas

1234 Proyecto\BD\MySQLProyecto\BD\MongoProyecto\PDF\FilePDFProyecto\Librerias\LibreriaGraficas


Usar Namespaces

Ya que sabemos como declarar los namespace ahora tenemos que aprender como llamar clases, funciones o variables que estén en ellos. Vamos a crear una clase y definirla dentro un namespace:

//carro.php // la clase Carro y CONSTANTE estarán en el namespace Codehero\Cursos namespace Codehero\Cursos; const CONSTANTE = 'Constante de Ejemplo'; class Carro{ static function rodar(){ // código de la función rodar } }

12345678910111213 //carro.php // la clase Carro y CONSTANTE estarán en el namespace Codehero\CursosnamespaceCodehero\Cursos; constCONSTANTE='Constante de Ejemplo';   classCarro{   staticfunctionrodar(){  // código de la función rodar  }}

Ahora vamos a importar el archivo de carro.php y utilizar la clase Carro y la constante.

require_once('carro.php'); // Como no hay un namespace definido en este archivo // tenemos que llamar a la constante y la función todo // el namespace completo (ruta absoluta). // Siempre que utilicemos un namespace directamente // hay que empezar con un \ slash invertido $carro = \Codehero\Cursos\Carro::rodar(); $constante = \Codehero\Cursos\CONSTANTE;

123456789 require_once('carro.php');   // Como no hay un namespace definido en este archivo // tenemos que llamar a la constante y la función todo // el namespace completo (ruta absoluta).// Siempre que utilicemos un namespace directamente // hay que empezar con un \ slash invertido$carro=\Codehero\Cursos\Carro::rodar();$constante=\Codehero\Cursos\CONSTANTE;

Claro esta que cuando tenemos muchas funciones que debemos llamar de varios namespaces es muy tedioso escribir todas las rutas completas. Para esto existe la opción de importar namespaces con la sentencia use. Se pueden importar todos los que sean necesarios, veamos un ejemplo de como importarlos:

require_once('carro.php'); use Codehero\Cursos; // Ya no es necesario utilizar toda la ruta porque PHP intenta buscar // en los namespaces que se esten usando, en este caso el global y el // Codehero\Cursos. $carro = Carro::rodar(); $constante = CONSTANTE;

12345678 require_once('carro.php');  useCodehero\Cursos; // Ya no es necesario utilizar toda la ruta porque PHP intenta buscar// en los namespaces que se esten usando, en este caso el global y el // Codehero\Cursos.$carro=Carro::rodar();$constante=CONSTANTE;


Conclusión

En este capítulo hemos tenido nuestro primer contacto con los namespaces, todavía falta mucho que aprender sobre los mismos y se cubrirá en el siguiente capítulo viendo ejemplos reales con un mini proyecto. Hoy en día muchos frameworks hacen uso de los namespaces y es muy importante saberlos usar cuando tengamos proyectos grandes y complejos. Cualquier comentario o duda estaré atento a la sección de comentarios.


Volver a la Portada de Logo Paperblog