Función personalizada para la autocarga de clases en POO en PHP
A menudo la autocarga por defecto puede no satisfacerte por alguna razón. En tal caso puedes escribir tu propia autocarga.
Para ello, a la función spl_autoload_register
hay que pasarle como primer parámetro tu
función callback escrita por ti. Esta función se llamará
cuando PHP detecte un acceso a una
clase no cargada. El parámetro de esta función
recibiré el nombre de la clase con su espacio de nombres:
<?php
spl_autoload_register(function($class) {
// en la variable $class estará el nombre de la clase con el espacio de nombres
});
?>
Y la responsabilidad de la función será cargar
esa clase mediante require basándose en el nombre de la clase.
Es decir, dentro de esta función debemos escribir
nuestra propia regla para cargar clases, es decir,
nuestra propia convención de nomenclatura.
Escribamos un ejemplo de una autocarga personalizada. Supongamos, por ejemplo, que decidimos que la ruta al archivo de la clase desde la raíz del sitio será la misma que el espacio de nombres, pero conservando las mayúsculas y minúsculas.
Es decir, si tenemos la clase Core\Admin\PageController,
su ruta debe ser Core/Admin/PageController.php.
Como ves, para transformar el nombre de la clase
con su espacio de nombres solo necesitas cambiar
las barras invertidas por barras normales,
y al nombre de la clase
añadir .php. Hagamos esto:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Sin embargo, obtendremos una ruta relativa al archivo (relativa a la raíz del sitio). Es mejor hacer una ruta absoluta, así:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Hay otro matiz. En diferentes sistemas operativos
la ruta de carpetas puede usar la barra normal
o la invertida. Hagamos nuestro código independiente
del sistema operativo. Para ello, en lugar de
la barra normal para separar rutas usaremos
la constante DIRECTORY_SEPARATOR,
que contiene la barra correcta para el sistema operativo
en el que se está ejecutando nuestro
script. Finalmente obtendremos el siguiente código:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Prueba la función de autocarga que he creado.
Inventa tu propia regla de autocarga y impleméntala.