Pregunta

spl_autoload_register puede hacer este tipo de trabajo, pero no entiendo cómo es ese tipo de trabajo?

spl_autoload_register(array('Doctrine', 'autoload'));
¿Fue útil?

Solución

La idea básica es que usted no tiene que escribir las instrucciones include / require más:. Cada vez que usted está tratando de utilizar una clase no definida, PHP llamará al cargador automático

El trabajo del cargador automático, entonces, es determinar qué archivo debe ser cargado, y include ella, por lo que la convierte en la clase definida.

PHP puede entonces utilizar esa clase, como si fuera el que escribió la instrucción include, que de hecho se ha ejecutado en la función de carga automática.


El "truco" es que la función de carga automática:

  • sólo recibe el nombre de la clase
  • tiene que determinar qué archivo a la carga -. Es decir, qué archivo contiene esa clase

Esta es la razón por la convención de nombres, como el que se PERA, que dice que la clase como Project_SubProject_Component_Name se asignan a los archivos como Project/SubProject/Component/Name.php - es decir, '_' en los nombres de clase se sustituye por una barra (directorios , subdirectorios) en el sistema de archivos.


Por ejemplo, si se echa un vistazo en el método Doctrine_Core::autoload, que es la que se denomina como un cargador automático en su caso, contiene esta porción de código (después de tratar con algunos casos específicos)

$class = self::getPath() 
            . DIRECTORY_SEPARATOR . 
            str_replace('_', DIRECTORY_SEPARATOR, $className) 
            . '.php';
if (file_exists($class)) {
    require $class;
    return true;
}
return false;

Lo que significa el nombre de la clase se asigna al sistema de ficheros, sustituyendo '_' por '/', y añadiendo un .php final al nombre del archivo.

Por ejemplo, si usted está tratando de utilizar la clase Doctrine_Query_Filter_Chain, y no se sabe por PHP, la función Doctrine_Core::autoload será llamada; que va a determinar que el archivo que debe ser cargado es Doctrine/Query/Filter/Chain.php; y como existe ese archivo, que va a ser incluido -. lo que significa PHP ahora "sabe" la clase Doctrine_Query_Filter_Chain

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top