2011-12-13 14 views
15

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:

  1. ¿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?
  2. ¿Faltan algunas ventajas evidentes aquí fuera de las características obvias de OOP?
  3. ¿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; 
    } 
} 
+0

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

Respuesta

4

Está comparando funciones con métodos. Eso es solo azúcar sintáctico.

A menos que tenga un autocargador basado en mapas o uno que tenga una tabla de dependencias incorporada, no necesita ningún atributo de nivel de clase para realizar un seguimiento de las cosas (o podría recurrir a variables estáticas o globales de lo contrario). La reconfigurabilidad del tiempo de ejecución tampoco es una necesidad real en la práctica.

Puede hacer un autocargador de procedimiento configurable con constantes, etc. Tener propiedades de constructor no es tan significativo como un beneficio para la reutilización con una implementación de método. Solo puede verse un poco mejor.

0

Utilice la precompilada si ya utiliza otra parte importante del marco, de lo contrario, realmente no importa.

Además, el uso de un autocargador, con múltiples espacios de nombres/directorios registrados, reducirá la memoria muy ligeramente, pero eso no es realmente una preocupación.

+0

Gracias por la respuesta. Yo no uso dichos marcos. Generalmente prefiero seleccionar mis características favoritas de varios frameworks y no estoy buscando tener una discusión sobre "Deberías usar un framework" :) Además, actualmente estoy usando solo un autocargador. Acerca de actualizar la pregunta con un código de muestra . – rdlowrey

Cuestiones relacionadas