Sencillo autoloader de clases en php sin composer
Simple autoloader de clases en php sin usar composer
El autoloader lo que hace es escuchar por medio de la función spl_autoload_register un evento "use" y entonces captura esa ruta de clase
y la pasa como argumento el namespace con la clase que se va a importar.
Normalmente las aplicaciones comienzan con el namespace App. Algo así: App\Namespace1\Namespace2\...\NombreClase.
Una vez obtenido este localizador hay que transformarlo en la ruta real del fichero en cuestion.
Por norma general la carpeta src es la que alberga todos los archivos de la aplicación y se entiende que es equivalente al
espacio de nombres App.
Sabiendo esto así quedaría el loader.
<?php
/*
* autoloader.php
* ruta: carpeta-de-proyecto/src/autoloader.php
*/
//esta linea nos devolvería la ruta carpeta-de-proyecto/src
$thispath = dirname(__FILE__);
/*
la incluimos como parte del include_path.
El include path se usa como repositorio de rutas donde php buscará los ficheros que pedimos con
require, include, require_once include_once.
Es por esto que no tenemos que poner la ruta completa al archivo. En nuestro caso bastaría con la ruta
relativa desde src
*/
set_include_path(get_include_path().PATH_SEPARATOR.$thispath);
/*
Si tenemos una ruta tipo:
src/Controllers/HomeController.php y es el archivo que contiene la clase: App\Controllers\HomeController
deberíamos remplazar App por "", \ por / y agregar la extensión ".php" obteniendo así la ruta real relativa
a partir de src con lo cual include_once con ayuda del include_path haría lo siguiente:
include_once carpeta-de-proyecto/src/Controllers/HomeController.php
*/
spl_autoload_register(function(string $pathnsclass) {
$pathnsclass = str_replace(["App\\","\\"],["","/"], $pathnsclass);
$pathnsclass .= ".php";
include_once $pathnsclass;
});
Cómo se implementa
//archivo: public/index.php
date_default_timezone_set("UTC");
session_start();
ob_start();
//linea de bootstrapping
include_once "../src/autoload.php";
use App\Blog\Controllers\PublishController;
try {
(new PublishController())->publish();
}
catch (Exception | Throwable $ex) {
pr($ex->getMessage());
pr("file: ".$ex->getFile()." (".$ex->getLine().")");
}
ob_end_flush();
Se puede ver un ejemplo del autoloader en este micro proyecto MVC
Dejo el video de Sebastián Bergmann (el creador de PHPUnit) donde comenta que la función spl_autoload_register es la forma correcta de cargar clases en lugar
de function __autload() que se marca como obsoleta.
Cómo prepararse para PHP 8
Autor: Eduardo A. F.
Publicado: 12-04-2022 20:07
Actualizado: 16-04-2022 11:44