php - namespace - ¿Qué es la carga automática? ¿Cómo se usan spl_autoload,__autoload y spl_autoload_register?
spl_autoload_register namespace (2)
Estoy aprendiendo estándares avanzados de PHP e intentando implementar métodos nuevos y útiles. Anteriormente estaba usando __autoload
solo para escapar, incluidos varios archivos en cada página, pero recientemente he visto un consejo sobre __autoload manual
spl_autoload_register () proporciona una alternativa más flexible para las clases de carga automática. Por este motivo, se desaconseja utilizar __autoload () y es posible que esté en desuso o se elimine en el futuro.
pero realmente no puedo entender cómo implementar spl_autoload
y spl_autoload_register
Desde PHP 5.3, puede usar spl_autoload_register()
con espacios de nombres, lo que significa que puede organizar su proyecto y cargar automáticamente sus clases php sin requerir o incluir y sin redefinir una __autoload()
.
Para demostrar este comportamiento, solo crea un archivo llamado index.php:
<?php
spl_autoload_register();
var_dump(new Main/Application);
A continuación, 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:
<?php namespace Main;
class Application{}
spl_autoload_register()
permite registrar múltiples funciones (o métodos estáticos de su propia clase Autoload) que PHP colocará en una pila / cola y las 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 crear una instancia, PHP pasa este nombre como una cadena a spl_autoload_register()
, que le permite recoger la variable y usarla para "incluir" el clase / archivo. Como resultado, no necesita específicamente incluir esa clase a través de una declaración include / require ...
Simplemente llame a la clase que desea instanciar como en el ejemplo anterior, y dado que registró una función (a través de spl_autoload_register()
) que determinará dónde están ubicadas todas las clases, PHP usará esa función.
La ventaja de utilizar spl_autoload_register()
es que, a diferencia de __autoload()
, no necesita implementar una función de autocarga en cada archivo que cree. spl_autoload_register()
también le permite registrar múltiples funciones de autocarga 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 se llama aspl_autoload_register()
sin ningún parámetro, esta función se utilizará para cualquier llamada posterior a__autoload()
.
En términos más prácticos, si todos sus archivos están ubicados en un solo directorio y su aplicación utiliza no solo archivos .php, sino archivos de configuración personalizados con extensiones .inc, por ejemplo, una estrategia que podría usar sería agregar su directorio que contenga todos los archivos. archivos a la ruta include de PHP (a través de set_include_path()
).
Y dado que también necesita sus archivos de configuración, debería usar 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();
Como spl_autoload es la implementación predeterminada del método mágico __autoload()
, PHP llamará a spl_autoload cuando intente crear una nueva clase.
Espero que esto ayude...