Namespaces con PHP
Tags: php, oop, poo, spanish
Published: 2021-03-17 22:05:04

Desde PHP 5.3 tenemos la posibilidad de declarar namespaces que nos ayudarán a evitar la colisión de nombres en todo nuestro código.

Imaginemos que por esas grandes posibilidades tenemos dos o más clases declaradas con el mismo nombre en nuestro proyecto, y que en algún momento vamos a instanciar esta clase en alguna parte de nuestro código. Veamos un ejemplo:

Entonces tenemos la clase MiPrueba en el archivo prueba1.php con el siguiente código:

```php
<?php

class MiPrueba{
    public static function probar(){
        echo 'Probando desde prueba1.php';
        echo '<br>';
    }
}
``` 

Y también tenemos la clase prueba adentro del archivo prueba2.php con el siguiente código

```php
<?php

class MiPrueba{
    public static function probar(){
        echo 'Probando desde prueba2.php';
        echo '<br>';
    }
}
```

Y ahora vamos a querer usar estas clases con sus métodos en un controlador por ejemplo:

```php
<?php
include_once('prueba2.php');
include_once('prueba1.php');

MiPrueba::probar();

MiPrueba::probar();
```

Y cuando vamos a comprobar si los métodos funcionan pasa lo siguiente:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7wq8ctta93c8pcmqksc0.png)

¿Qué fue lo que pasó? En PHP como por ejemplo en Windows, Mac OS o Linux, podemos tener archivos del mismo nombre en diferentes directorios, pero no podemos tener archivos del mismo nombre adentro de un único directorio, y cuando utilizamos clases del mismo nombre en algún lugar de nuestro código este se comporta también como un directorio y no nos deja utilizar dos clases con el mismo nombre en el mismo archivo de php.


Para solucionar todo esto fue que se crearon los namespaces, que lo que hace es declarar las clases en un contexto más privado y no de manera global, entonces la clase queda encapsulada en un bloque de código, veamoslo en un ejemplo, si ahora a las mismas clases le declaramos un namespace quedarían así:

```php
<?php
namespace Prueba1;
class MiPrueba{
    public static function probar(){
        echo 'Probando desde prueba1.php';
        echo '<br>';
    }
}
```

```php
<?php
namespace Prueba2;
class MiPrueba{
    public static function probar(){
        echo 'Probando desde prueba2.php';
        echo '<br>';
    }
}
```

Dato importante: En el caso de que tuvieramos los archivos en directorios diferentes, para que sea una buena práctica, los nombre de los namespace tienen que ir primero con el nombre de su directorio, ejemplo si prueba1.php estuviera en directorio llamado pruebas sería algo así:

```php
<?php
namespace Pruebas\Prueba2;
class MiPrueba{
    public static function probar(){
        echo 'Probando desde prueba2.php';
        echo '<br>';
    }
}
```

Bien, ahora para poder utilizar las dos clases hacemos lo siguiente:

```php
include_once('prueba1.php');
include_once('prueba2.php');

echo Prueba1\MiPrueba::probar();
echo Prueba2\MiPrueba::probar();
```

También podemos cambiarles el nombre a través de la instrucción use indicaldole use as:

```php
use Prueba1\MiPrueba as Probar1;
use Prueba2\MiPrueba as Probar2;


echo Probar1::probar();
echo Probar2::probar();
```

Y en el caso de que no sean métodos estáticos tendremos que instanciarlos adentro de una variable:

```php
include_once('prueba1.php');
include_once('prueba2.php');

use Prueba1\MiPrueba as probar1;
use Prueba2\MiPrueba as probar2;

$prueba1 = new probar1();
$prueba1->probar();

$prueba2 = new probar2;
$prueba2->probar();
```

 Ahora si vamos al navegador por fin podemos comprobar que podemos hacer uso de una misma clase pero utilizando namespaces

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n2ajwnltght0xfrol94f.png)