Hasta este punto, he utilizado las funciones de autocargador autónomo de procedimiento y las he registrado con spl_autoload_register() para cargar automáticamente mis (usualmente) clases de espacio de nombres. Últimamente, sin embargo, me he dado cuenta de personas que mencionan el uso de clases de autocargador junto con algunos de los marcos de PHP destacados.clase de autocargador PHP vs. función de autocargador de procedimiento?
Casi todos los códigos de mi objeto están orientados a objetos en estos días, pero realmente no veo las ventajas de usar un "autocargador" de clase sobre una función básica en esta instancia. Y en términos de capacidad de prueba, me siento muy bien usando las comprobaciones class_exists() en mis pruebas para verificar que las funciones de procedimiento carguen los archivos correctamente.
Así que mis preguntas son tres:
- ¿Qué ventajas o características (si los hay) podría influir en mí refactorizar cosas y comenzar a usar un objeto soplado completo a los archivos de clase de carga automática?
- ¿Faltan algunas ventajas evidentes aquí fuera de las características obvias de OOP?
- ¿Podría hacer un caso para los autocargadores de clase o de procedimiento?
ACTUALIZACIÓN
A continuación se muestra un código de ejemplo para una función de carga automática típica podría emplear. Es un metacódigo, así que no busques errores tipográficos. Organizo las estructuras de mi directorio para que reflejen los espacios de nombres. La función hipotética explode_namespaces()
podría incluirse teóricamente como un método estático junto con un método estático autoload()
en una clase, por lo que ese es un beneficio. Puede ser más limpio combinar estas funciones dispares de "utilidad" como métodos en una sola clase.
function autoload($class_name)
{
$root = APP_LIBS; // a directory path constant set at config time
if ($namespaces = explode_namespaces($class_name)) {
$domain = array_shift($namespaces);
$root .= "/$domain/";
$class_name = array_pop($namespaces);
$directories = array();
foreach ($namespaces as $directory) {
$directories[] = $directory;
}
$root .= implode($directories, '/');
}
$file = "$root/$class_name.php";
if (file_exists($file)) {
include $file;
}
}
He eliminado la parte "respuesta" de su pregunta, ya que es irrelevante para la pregunta realmente. Debería considerar agregar su propia respuesta, es probable que ayude a los demás :) – James