Cuando usamos clases de diferentes bibliotecas (o incluso clases de diferentes componentes de
una misma biblioteca) en nuestro programa los nombres de las clases pueden chocar. Esto significa
que podemos encontrar dos clases con el mismo nombre, el resultado es un error de interpretación
de PHP. Si alguna vez programamos sitios webs con Zend Framework 1 podemos recordar esos nombres de
clases extra largos como Zend_Controller_Abstract
. La idea detrás de estos nombres tan largos
era evitar la colisión de nombres entre diferentes componentes. Cada componente definía su propio
prefijo como Zend_
o My_
Para alcanzar el mismo objetivo Zend Framework 3 usa una característica de PHP llamada namespaces. Los namespaces o espacio de nombres permiten resolver la colisión de nombres entre componentes y nos permite tener nombres más cortos.
Un namespace es un contenedor para un grupo de nombres. Podemos anidar un
namespaces dentro de otro.
Si una clase no define un namespace ella se puede buscar dentro del namespace
global (por ejemplo, las clases de PHP Exception
o DateTime
pertenecen al
namespace global).
Un ejemplo realista de la definición de un namespace, tomado del componente
Zend\Mvc
, se muestra abajo:
<?php
namespace Zend\Mvc;
/**
* Main application class for invoking applications.
*/
class Application
{
// ... class members were omitted for simplicity ...
}
En Zend Framework 3 todas las clases están dentro del namespace de primer nivel Zend.
La línea 2 define el namespace Mvc que está anidado dentro del namespace Zend,
todas las clases de este componente (incluida la clase Application
que se muestra entre
las líneas 7-10) pertenece a este namespace. Los namespace anidados se separan con
la barra invertida ('\').
En las otras partes del código hacemos referencia a la clase Application
usando su nombre completo (fully-qualified name):
<?php
$application = new \Zend\Mvc\Application();
Obsérvese la presencia de la primera barra invertida en el nombre
\Zend\Mvc\Application
. Si especificamos un nombre de clase que comienza con una barra invertida estamos usando el nombre completo de la clase. Es posible especificar un nombre de clase relativo al actual namespace, en este caso no usamos la barra invertida inicial.
Es posible usar alias (un nombre corto para la clase) con la ayuda de la sentencia
use
de PHP:
<?php
// Define the alias in the beginning of the file.
use Zend\Mvc\Application;
// Later in your code, use the short class name.
$application = new Application();
Aunque los alias permiten usar nombres de clase cortos en lugar del nombre completo su uso es opcional. No es necesario usar alias y podemos hacer referencia a la clase por su nombre completo cualificado.
Generalmente, cada archivo PHP de nuestra aplicación define un espacio de nombres (excepto el script de inicio index.php y los archivos de configuración que comúnmente no tienen un espacio de nombres. Por ejemplo, el módulo principal de nuestro sitio web, el módulo Application define su propio espacio de nombres y este es igual al nombre del módulo:
<?php
namespace Application;
class Module
{
// ... class members were omitted for simplicity ...
}