Namespaces

Namespaces

Los espacios de nombres en PHP son un mecanismo diseñado para evitar colisiones de nombres.

En el mundo de php, los espacios de nombres están diseñados para solucionar:

  • El conflicto de nombres entre el código que se crea y el que existe internamente en php o en bibliotecas de terceros

  • La capacidad de abreviar la legibilidad del código

  • Los namespaces de php únicamente cubren los siguientes elementos PHP: Clases - Interfaces - Traits - Funciones - Constantes declaradas con const pero no con define

Los namespaces se ponen a todos esos elementos nuevos que se creen, para evitar conflictos.

`// Esto da error, porque hay dos clases con el mismo nombre
require_once "Clases/Alumno.php";
require_once "Otras/Alumno.php";`

Para solucionarlo, le damos un namespace a las dos clases.

namespace Clases\Alumno;
class Alumno{

}

namespace Otras\Alumno;
class Alumno
{

}

De esta forma ya podemos usar dos clases que se llaman igual

require_once "Clases/Alumno.php";
require_once "Otras/Alumno.php";

// Como el nombre de la clase es el mismo, tenemos que darle a una
// un Alias para que a la hora de instanciar, saber cual utilizar
use Otras\Alumno\Alumno as otraAlumno;
use Clases\Alumno\Alumno;
// El usar use solo indica que queremos usar esas clases en esta parte del 
// código, pero no carga esas clases en este archivo, para eso hay que seguir
// utilizando el require o include
$claseAlumno = new Alumno();
$claseAlumno->helloWorld(); // hello from clases/alumno
$otraAlumno = new otraAlumno();
$otraAlumno->helloWorld(); // hello from otras/alumno

Auto loader

Como indica el ejemplo anterior, para traernos el código de otro file, todavía es necesario usar require.

Pero podemos cargar clases sin usar require o include con el auto loader. En lugar de tener que cargar cada una de las clases de nuestra aplicación manualmente, podemos crear un autoloader.

Como su propio nombre indica, el autoloader está destinado a cargar de forma automática las clases utilizadas.

Cada vez que se intenta inicializar una clase y la clase no existe, el nombre de esta clase se pasa al autoloader y este es ejecutado. En el autoloader podremos automatizar el proceso de carga sin tener que incluir manualmente cada archivo y además nos permite hacer el código más rápido, pues solo se cargaran las clases que efectivamente se utilicen

// Vamos a ver como usar el autoloader para cargar las clases en este file sin necesidad de usar el require

// Esta funcion recibe un callback que llamara cuando se intente acceder
// a una clase y no se encuentre
// el callback recibe el nombre de la clase, por lo que lo que se ha hecho es crear un autoloader manual muy sencillo,
// se van haciendo require_once con el nombre de la clase que se intenta 
//acceder. El callback solamente se recibira cuando se intente acceder
// a una clase y no se encuentre, por lo que solo nos carga en este file 
// las clases y archivos a los cuales estamos intentando acceder.
spl_autoload_register(function($clase){
    $nombre_archivo = str_replace('\\', '/', $clase).'.php';
    echo $nombre_archivo;
    if (file_exists($nombre_archivo)){
        require_once $nombre_archivo;
    }
});

use Clases\Alumno;
use Otras\Alumno as otraAlumno;

$claseAlumno = new Alumno();
$claseAlumno->helloWorld();
$otraAlumno = new otraAlumno();
$otraAlumno->helloWorld();