spl_autoload_register()
le permite registrar múltiples funciones (o métodos estáticos de su propia clase Autoload) que PHP colocará en una pila / cola y llamará secuencialmente cuando se declare una "nueva Clase".
Así por ejemplo:
spl_autoload_register('myAutoloader');
function myAutoloader($className)
{
$path = '/path/to/class/';
include $path.$className.'.php';
}
//-------------------------------------
$myClass = new MyClass();
En el ejemplo anterior, "MyClass" es el nombre de la clase que está intentando instanciar, PHP le pasa este nombre como una cadena spl_autoload_register()
, lo que le permite elegir la variable y usarla para "incluir" la clase / archivo apropiado . Como resultado, no necesita incluir específicamente esa clase a través de una declaración de inclusión / requerimiento ...
Simplemente llame a la clase que desea instanciar como en el ejemplo anterior, y dado que registró una función (vía spl_autoload_register()
) propia que determinará dónde están ubicadas todas sus clases, PHP usará esa función.
El beneficio de usar spl_autoload_register()
es que, a diferencia de __autoload()
usted, no necesita implementar una función de carga automática en cada archivo que cree. spl_autoload_register()
también le permite registrar múltiples funciones de carga automática para acelerar la carga automática y hacerlo aún más fácil.
Ejemplo:
spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');
class MyAutoloader
{
public static function ClassLoader($className)
{
//your loading logic here
}
public static function LibraryLoader($className)
{
//your loading logic here
}
Con respecto a spl_autoload , el manual dice:
Esta función está destinada a ser utilizada como una implementación predeterminada para __autoload()
. Si no se especifica nada más y spl_autoload_register()
se llama sin ningún parámetro, esta función se utilizará para cualquier llamada posterior __autoload()
.
En términos más prácticos, si todos sus archivos están ubicados en un solo directorio y su aplicación usa no solo archivos .php, sino también archivos de configuración personalizados con extensiones .inc, entonces una estrategia que podría usar sería agregar su directorio que contenga todos Los archivos a PHP incluyen ruta (vía set_include_path()
).
Y dado que también necesita sus archivos de configuración, usaría spl_autoload_extensions()
para enumerar las extensiones que desea que busque PHP.
Ejemplo:
set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();
Dado que spl_autoload es la implementación predeterminada del __autoload()
método mágico, PHP llamará a spl_autoload cuando intentes crear una nueva clase.
Espero que esto ayude...
spl_autoload_register()
(y__autoload()
en general) que las cargas perezosas incluyen archivos / clases? Esto está implícito en la respuesta, pero no se establece explícitamente. ¡Para mí, esta es información crítica que sería perfecta para incluir en su respuesta! :)Desde PHP 5.3, puede usar
spl_autoload_register()
espacios de nombres, lo que significa que puede organizar su proyecto y cargar automáticamente sus clases de php sin requerir o incluir y sin redefinir una__autoload()
función.Para demostrar este comportamiento, simplemente cree un archivo llamado index.php:
Luego, cree una carpeta llamada Main ubicada justo al lado del archivo index.php. Finalmente, crea un archivo llamado Application.php ubicado en Main y pega el siguiente código en él:
fuente
spl_autoload_register()
la implementación predeterminada no puede encontrar clases heredadas. Entonces, usando valores predeterminados, archivos en minúsculas y directorios que reflejan la ruta del espacio de nombres, todo funciona bien a menos que tenga una clase que extienda otra clase (padre). PHP luego arroja un error de que no puede encontrar esa clase padre, ¡incluso si todos están en el mismo directorio / espacio de nombres! Lo que es confuso es que, literalmente, solo se encuentran las clases de primer nivel, por lo que tuve que poner otraspl_autoload_register()
con una regla de función anónima justo después de la primera para poder incluir manualmente las clases principales / heredadas que faltan.Aquí está la forma en que uso Autoload. En el ejemplo dado, quiero cargar clases de 3 directorios diferentes.
En el ejemplo dado, el PHP buscará el espacio de nombres \ clase en estos tres directorios usando estos tres formatos de nombre de archivo diferentes.
fuente