Menu
Coddy logo textTech

Introducción a los espacios de nombres

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 10 de 91.

A medida que tus proyectos de PHP crecen, crearás muchas clases. ¿Qué sucede cuando dos clases tienen el mismo nombre?

Por ejemplo, podrías tener una clase User para tu blog y otra clase User para tu tienda. Los espacios de nombres resuelven este problema organizando las clases en grupos lógicos.

Un espacio de nombres es como una carpeta para tus clases. Lo declaras en la parte superior de tu archivo PHP usando la palabra clave namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Ahora puedes tener otra clase User en un espacio de nombres diferente:

<?php
namespace Shop;

class User {
    public $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

Para usar una clase con espacio de nombres, se hace referencia a ella con su ruta completa usando una barra invertida:

<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");

echo $blogUser->name . "\n";
echo $shopUser->email . "\n";

Salida:

Alice
alice@example.com

La barra invertida \ separa los niveles de los espacios de nombres, de manera similar a cómo las barras separan las carpetas en una ruta de archivo. También puedes crear espacios de nombres anidados como App\Models\Blog para una organización más profunda.

Punto clave: Los espacios de nombres evitan conflictos de nombres y mantienen su código organizado. Declare siempre el espacio de nombres antes de cualquier otro código en su archivo (excepto por las sentencias declare).

challenge icon

Desafío

Fácil

Vamos a organizar una pequeña aplicación utilizando espacios de nombres (namespaces) para evitar conflictos de nombres entre clases con el mismo nombre.

Imagina que estás construyendo un sistema que maneja tanto vehículos como animales. Ambos dominios tienen una entidad llamada Car — una representa un automóvil real, mientras que la otra es un gato mascota llamado "Car" (¡sí, algunas personas llaman así a sus gatos!).

Crearás tres archivos:

  • Vehicle/Car.php — Define una clase Car en el espacio de nombres Vehicle con una propiedad public $brand. El constructor debe aceptar el nombre de la marca y establecerlo. Añade un método describe() que devuelva "Vehicle: [brand]".
  • Animal/Car.php — Define una clase Car en el espacio de nombres Animal (¡este es un gato llamado Car!). Debe tener una propiedad public $age. El constructor acepta la edad y la establece. Añade un método describe() que devuelva "Cat named Car, age: [age]".
  • main.php — Incluye ambos archivos de clase usando require_once. Crea un objeto de cada espacio de nombres utilizando sus rutas completas de espacio de nombres, luego imprime el resultado de llamar a describe() en cada objeto (cada uno en su propia línea).

En main.php, crea:

  • Un Vehicle\Car con la marca "Toyota"
  • Un Animal\Car con la edad 3

Recuerda usar la barra invertida \ para referenciar clases con espacios de nombres con su ruta completa al crear objetos.

Hoja de referencia

Los espacios de nombres organizan las clases en grupos lógicos y evitan conflictos de nombres cuando varias clases comparten el mismo nombre.

Declare un espacio de nombres en la parte superior de un archivo PHP utilizando la palabra clave namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Puede tener clases con el mismo nombre en diferentes espacios de nombres:

<?php
namespace Shop;

class User {
    public $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

Para utilizar una clase con espacio de nombres, hágale referencia con su ruta completa utilizando una barra invertida \:

<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");

echo $blogUser->name . "\n";
echo $shopUser->email . "\n";

La barra invertida separa los niveles de los espacios de nombres, de forma similar a las rutas de las carpetas. Puede crear espacios de nombres anidados como App\Models\Blog.

Importante: Declare siempre el espacio de nombres antes de cualquier otro código en su archivo (excepto las sentencias declare).

Pruébalo tú mismo

<?php
// Incluir los archivos de clase
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';

// TODO: Crear un objeto Vehicle\Car con la marca "Toyota"
// Recuerda usar la ruta completa del espacio de nombres con barra invertida

// TODO: Crear un objeto Animal\Car con la edad 3
// Recuerda usar la ruta completa del espacio de nombres con barra invertida

// TODO: Imprimir el resultado de describe() para cada objeto (cada uno en su propia línea)

?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos