¿Cuál es el principio de auto carga en PHP?
-
21-09-2019 - |
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'));
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