jairogarcíarincón
A medida que se va complicando nuestro proyecto, irá aumentando el número de clases en el mismo. No siempre vamos a usar todas, ni sabemos cuando lasvamos a usar.
Para ello, PHP provee de la funcionalidad spl_autoload_register() que permite, a partir de una función que recorra los directorios de nuestro proyecto, "pre-cargar" todas las clases que encuentre dentro de él, pero realmente no requerirlas hasta que no sean instanciadas.
Esto nos va a optimizar el desarrollo y por supuesto la ejecución, ya que en los frameworks actuales podemos encontrar miles de clases disponibles, pero no tiene sentido requerirlas todas en cada petición HTTP.
Para ver cómo funciona, vamos a modificar nuestro archivo raíz index.php del proyecto de coches para que cargue automáticamente todas las clases:
<?php
//Defino la función que atocargará la clase cuando se instancie
spl_autoload_register('autoload');
function autoload($clase,$dir=null){
//Directorio raíz de mi proyecto (ruta absoluta)
if (is_null($dir)){
$dir = realpath(dirname(__FILE__));
}
//Escaneo en busca de clases de forma recursiva
foreach (scandir($dir) as $file){
//Si es un directorio (y no es de sistema) busco la clase dentro de él
if (is_dir($dir."/".$file) AND substr($file, 0, 1) != "."){
autoload($clase, $dir."/".$file);
}
//Si es archivo y el nombre coincide con la clase que quiero instanciar
else if (is_file($dir."/".$file) AND $file == $clase.".php"){
require($dir."/".$file);
}
}
}
//Instancio el controlador
$controller = new CocheController;
//Ruta de la home
$home = "/formacion/poo/ejemplo7/index.php/";
//Quito la home de la ruta de la barra de direcciones
$ruta = str_replace($home, "", $_SERVER["REQUEST_URI"]);
//Creo el array de ruta (filtrando los vacíos)
$array_ruta = array_filter(explode("/", $ruta));
//Decido la ruta en función de los elementos del array
if (isset($array_ruta[0]) && $array_ruta[0] == "ver" && is_numeric($array_ruta[1])){
//Llamo al método ver pasándole la clave que me están pidiendo
$controller->ver($array_ruta[1]);
}
else{
//Llamo al método por defecto del controlador
$controller->index();
}
Ejercicio propuesto 6
- Modifica el Ejercicio 5 para que auto-cargue las clases de tu proyecto.
Publicado el 21 de Noviembre de 2024