Namespaces en PHP

Para empezar, un poco de teoría sobre que son los namespaces (o nombres de espacio). Con la salida de la versión de PHP 5.3, una de las novedades más importantes que se incorporaron fué la posibilidad de utlizar namespaces, como ya se podían hacer en otros lenguajes de programación como eran C, C++ y Java, por ejemplo.

Para entender que es un namespace, podemos recurrir a la definición que encontramos en la propia Wikipedia: Un namespace es "un contenedor abstracto que agrupa de forma lógica varios símbolos e identificadores" y los utilizaremos básicamente, para estructurar mejor nuestro código fuente.

Antes de que salieran los namespaces, en PHP todas las clases, constantes y funciones cargadas se ubican en un espacio global.

Para explicar el uso de namespace, crearé un supuesto modelo desde el cual accederemos después mediante el controlador:

namespace Users\Model;

class UserModel {

    private String $nick = '';

    public function getNick() {
        return $this->nick;
    }

    public function setNick($p_nick) {
        $this->nick = $p_nick;
    }
}

En este ejemplo, vemos como un namespace puede tener sub-namespaces. "Model", es un sub-namespace dentro de "Users"

Una vez definida una clase en el namespace "Users\Model", podremos acceder a ella mediante otra clase, en este caso un controlador. Hay que recordar que, en caso de ser necesario hacer un include o un require, tendremos que hacerlo SIEMPRE después de la declaración del namespace.

namespace Users\Controller;
require_once 'users_model.php';

$bd = new \Users\Model\UserModel();
$bd->setNick('ZonaDev');

var_dump($bd->getNick());

En el caso de que la clase controlador y la clase modelo se encontraran en el mismo nombre de espacio, no haría falta añadir la ruta del nombre de espacio en la declaración.

También es interesante saber, que si vamos a utilizar mucho los objetos ubicados en un mismo namespace, podemos ahorrarnos bastante trabajo haciendo uso de la sentencia use, que además nos permite definir un alias para las clases. Aquí van algunos ejemplos:

namespace Users\Controller;
use Users\Model;
require_once 'users_model.php';

$bd = new UserModel();
$bd->setNick('ZonaDev');

var_dump($bd->getNick());

Usando alias:

namespace Users\Controller;
use Users\Model\UserModel as User;
require_once 'users_model.php';

$bd = new User();
$bd->setNick('ZonaDev');

var_dump($bd->getNick());

Con esta pequeña introducción a los namespaces, podremos entender mucho mejor el funcionamiento de los nuevos frameworks MVC que están saliendo y hacen uso de ellos, como es el ejemplo de Symfony2 y el inminente Zend Framework 2, además de motivarnos a utilizarlos para todo tipo de proyecto desarrollado en php.

Si quieres aprender más sobre el uso de namespaces, te recomiendo mirarte la documentación oficial de PHP en los siguientes enlaces:

Espacios de nombres (namespaces)
Usar espacios de nombres: Lo básico
FAQ: Cosas que se necesitan saber sobre los espacios de nombres

NOTA: Os recomiendo que leais el libro "Desarrollo web ágil con Symfony2" de Javier Equiluz, en el explica bastante bien que son los namespaces y como debemos utilizarnos (aplicando al entorno de Symfony2, claro).

0 comentarios:

Publicar un comentario