A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

3.2. PHP Namespaces

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 ...
}

Top