Espacio de nombres
Desde PHP 5.3 y también conocidos como Namespaces, permiten organizar las clases/interfaces, funciones y/o constantes de forma similar a los paquetes en Java.
Un sólo namespace por archivo y crear una estructura de carpetas respectando los niveles/subniveles (igual que se hace en Java)
Se declaran en la primera línea mediante la palabra clave namespace seguida del nombre del espacio de nombres asignado (cada subnivel se separa con la barra invertida \):
Por ejemplo, para colocar la clase Producto dentro del namespace Dwes\Ejemplos lo haríamos así:
<?php
namespace Dwes\Ejemplos;
const IVA = 0.21;
class Producto {
public $nombre;
public function muestra() : void {
echo"<p>Prod:" . $this->nombre . "</p>";
}
}
Acceso
Para referenciar a un recurso que contiene un namespace, primero hemos de tenerlo disponible haciendo uso de include o require. Si el recurso está en el mismo namespace, se realiza un acceso directo (se conoce como acceso sin cualificar).
Realmente hay tres tipos de acceso:
- sin cualificar:
recurso - cualificado:
rutaRelativa\recurso→ no hace falta poner el namespace completo - totalmente cualificado:
\rutaAbsoluta\recurso
<?php
namespace Dwes\Ejemplos;
include_once("Producto.php");
echo IVA; // sin cualificar
echo Utilidades\IVA; // acceso cualificado. Daría error, no existe \Dwes\Ejemplos\Utilidades\IVA
echo \Dwes\Ejemplos\IVA; // totalmente cualificado
$p1 = new Producto(); // lo busca en el mismo namespace y encuentra \Dwes\Ejemplos\Producto
$p2 = new Model\Producto(); // daría error, no existe el namespace Model. Está buscando \Dwes\Ejemplos\Model\Producto
$p3 = new \Dwes\Ejemplos\Producto(); // \Dwes\Ejemplos\Producto
Para evitar la referencia cualificada podemos declarar el uso mediante use (similar a hacer import en Java). Se hace en la cabecera, tras el namespace:
Los tipos posibles son:
use const nombreCualificadoConstanteuse function nombreCualificadoFuncionuse nombreCualificadoClaseuse nombreCualificadoClase as NuevoNombre// para renombrar elementos
Por ejemplo, si queremos utilizar la clase \Dwes\Ejemplos\Producto desde un recurso que se encuentra en la raíz, por ejemplo en inicio.php, haríamos:
<?php
include_once("Dwes\Ejemplo\Producto.php");
use const Dwes\Ejemplos\IVA;
use \Dwes\Ejemplos\Producto;
echo IVA;
$p1 = new Producto();
¿Cuándo usar use?
La palabra clave use permite acceder sin cualificar a recursos que están en otro namespace. Si estamos en el mismo espacio de nombre, no necesitamos use.
Organización
Todo proyecto, conforme crece, necesita organizar su código fuente. Se plantea una organización en la que los archivos que interactuan con el navegador se colocan en el raíz, y las clases que definamos van dentro de un namespace (y dentro de su propia carpeta src o app).

Organización, includes y usos
- Colocaremos cada recurso en un fichero aparte.
- En la primera línea indicaremos su namespace (si no está en el raíz).
- Si utilizamos otros recursos, haremos un
include_oncede esos recursos (clases, interfaces, etc...).- Cada recurso debe incluir todos los otros recursos que referencie: la clase de la que hereda, interfaces que implementa, clases utilizadas/recibidas como parámetros, etc...
- Si los recursos están en un espacio de nombres diferente al que estamos, emplearemos
usecon la ruta completa para luego utilizar referencias sin cualificar.