Namespaces en PHP para evitar clases repetidas

Resumen

Los namespaces en PHP son una herramienta clave para organizar tu código cuando trabajas con clases que pueden llamarse igual. Si ya dominas include, require y la modularización, este es el siguiente paso para mantener tu proyecto limpio y libre de conflictos.

Piensa en un namespace como un apellido para tus clases. Puedes tener dos clases llamadas Michi, pero si una vive en el vecindario MichisDisponibles y la otra en MichisAdoptados, PHP sabrá exactamente cuál usar.

¿Qué es un namespace en PHP y para qué sirve?

Un namespace es un contenedor lógico que agrupa clases, interfaces, funciones y constantes bajo un mismo identificador. Sirve para evitar colisiones de nombres cuando dos elementos se llaman igual pero pertenecen a contextos distintos.

¿Qué es un namespace en PHP? Es un espacio de nombres que actúa como apellido de tus clases, interfaces, funciones y constantes para que no choquen con otras que tengan el mismo nombre.

La analogía más clara: dos casas llamadas casa, una en el vecindario A y otra en el vecindario B. Cuando alguien pregunta a cuál ir, el vecindario es el namespace que aclara la duda [03:10].

¿A qué elementos del código afecta un namespace?

Un namespace puede contener cualquier tipo de código, pero impacta principalmente sobre:

  • Clases, incluyendo clases abstractas y traits.
  • Interfaces.
  • Funciones.
  • Constantes.

¿Cómo declarar un namespace y resolver clases con el mismo nombre?

Imagina que tienes una carpeta Clases con dos subcarpetas: MichisDisponibles y MichisAdoptados. Dentro de cada una, un archivo Michi.php con su propia clase Michi. Si intentas requerir ambos archivos en el mismo script, PHP lanzará el error cannot redeclare class Michi porque no distingue entre las dos [08:30].

La solución es declarar un namespace al inicio de cada archivo:

php

<?php namespace MichisDisponibles; class Michi { // propiedades y métodos del michi disponible } php <?php namespace MichisAdoptados; class Michi { protected $name; protected $dateAdopted; protected $adoptedBy; public function __construct($name, $dateAdopted, $adoptedBy) { $this->name = $name; $this->dateAdopted = $dateAdopted; $this->adoptedBy = $adoptedBy; } } Ahora la primera clase se llama, en realidad, `MichisDisponibles\Michi` y la segunda `MichisAdoptados\Michi`. Mismo nombre, apellido distinto. ### ¿Cómo importar una clase con use en PHP? Usar la ruta completa cada vez que instancias una clase es feo y poco legible. PHP ofrece la palabra clave `use` para importar el namespace una sola vez: php use MichisDisponibles\Michi; $michi = new Michi("Mister Michi", "naranja"); Con eso, PHP entiende que cada vez que escribas `Michi` en ese archivo, te refieres a la versión que vive en `MichisDisponibles`. ## ¿Cómo usar dos clases con el mismo nombre en un solo archivo? Aquí viene lo interesante. Si necesitas trabajar con `MichisDisponibles\Michi` **y** con `MichisAdoptados\Michi` en el mismo script, importarlas tal cual genera conflicto otra vez. La solución es renombrar una de ellas con `as`: php use MichisDisponibles\Michi; use MichisAdoptados\Michi as MichiAdoptado; $misterMichi = new Michi("Mister Michi", "naranja"); $misterMichiAdopted = new MichiAdoptado( "Mister Michi", new DateTime("2022-04-21"), "Retaxito" ); El alias solo aplica dentro de ese archivo. La clase original sigue llamándose `Michi` en el resto del proyecto. > **¿Para qué sirve la palabra clave `as` en un use de PHP?** Sirve para crear un alias y renombrar una clase importada solo en el archivo actual, evitando colisiones cuando dos clases comparten nombre. ### ¿Cómo se ve el resultado en pantalla? Una vez instanciadas ambas clases, puedes mezclarlas sin problemas en tu vista: - `Mister Michi fue adoptado por Retaxito`. - `Michi Sánchez fue adoptado por Juanito`. - `Michales fue adoptado por Pedrito`. Fíjate cómo dos clases idénticas en nombre conviven gracias a sus apellidos. ## ¿Por qué usar namespaces mejora el control de tu proyecto? Los namespaces te permiten escalar tu código sin miedo a que dos librerías o módulos pisen los nombres entre sí. Cuando tu proyecto crece y empiezas a integrar paquetes externos, **mantener cada clase en su propio espacio es lo que evita errores de redeclaración** y te da claridad sobre de dónde viene cada pieza. Algunos puntos prácticos para recordar: - Declara `namespace` en la primera línea ejecutable del archivo. - Usa la barra invertida `\` como separador entre niveles del namespace. - Importa con `use` para escribir menos y leer mejor. - Aplica `as` cuando dos clases importadas comparten nombre. ¿Ya identificaste en tu propio código clases que podrían beneficiarse de un apellido? Cuéntame en los comentarios cómo organizarías tus namespaces y qué dudas te quedaron sobre esta práctica con los michis.