spl_autoload_register psr namespace instead funciona como __autoload php spl-autoload-register

psr - spl_autoload_register php



PHP spl_autoload_register (6)

Buen consejo de todas las otras respuestas.

Permítanme agregar que cada autocargador debería verificar primero si le importa la clase que se está transfiriendo, y devolver inmediatamente si no es así.

Entonces, si haces lo que Gordon sugiere y agrega un prefijo a cada clase, entonces para el Autos_Foo, el autocargador autoload_services() debería ver si "Services_" es la primera subcadena de $class_name , y si no devuelve false inmediatamente para guardar en cualquier procesamiento adicional, especialmente las verificaciones del sistema de archivos.

Estoy tratando de aprovechar la carga automática en PHP. Tengo varias clases en diferentes directorios, por lo que tengo bootstrap la carga automática de la siguiente manera:

function autoload_services($class_name) { $file = ''services/'' . $class_name. ''.php''; if (file_exists($file)) { require_once($file); } } function autoload_vos($class_name) { $file = ''vos/'' . $class_name. ''.php''; if (file_exists($file)) { require_once($file); } } function autoload_printers($class_name) { $file = ''printers'' . $class_name. ''.php''; if (file_exists($file)) { require_once($file); } } spl_autoload_register(''autoload_services''); spl_autoload_register(''autoload_vos''); spl_autoload_register(''autoload_printers'');

Todo parece funcionar bien, pero solo quería comprobar que esto se considera una práctica aceptable.


Claro, se ve bien. Lo único que puedes hacer es registrarlos en el orden en el que es más probable que lleguen. Por ejemplo, si sus clases más comúnmente usadas son servicios, entonces vos, luego impresoras, la orden que tiene es perfecta. Esto se debe a que están en cola y llamados en orden, por lo que obtendrá un rendimiento ligeramente mejor al hacer esto.


Está bien, pero si estas son solo carpetas debajo de cierta carpeta, por ejemplo

/library /JonoB /services /vos /printers

Es posible que desee considerar agregar estos a sus nombres de clase, por ejemplo

JonoB_Services_Foo, JonoB_Vos_Bar, JonoB_Printers_Baz

y luego divida el $classname por el guión bajo y tome cada parte como nombre de carpeta. Esto es similar a la convención de nombre de clase PEAR . De esta manera solo tendrías un cargador.

En lugar de namespaces clase de estilo de convención PEAR, también puede usar namespaces ( ejemplo de carga automática ), pero tenga en cuenta que estos requieren PHP5.3, que aún no está ampliamente disponible en el alojamiento compartido. Y su aplicación no será retrocompatible con PHP <5.3 entonces (si eso es un problema).


He escrito mi propio ClassLoader usando spl_autoload_register.
La ventaja es que la función se ve en cada subcarpeta que comienza en la carpeta actual.
Simplemente incluyo este archivo en cada archivo PHP y nunca me tengo que preocupar por ninguna directiva include / require.
Simplemente funciona :-)

<?php spl_autoload_register(''AutoLoadClasses''); /************************************************************************************ * AutoLoadClasses * * Diese Funktion lädt Klassen in gleichnamigen Dateien bei Bedarf automatisch nach, * sobald eine (bis dahin unbekannte) Klasse erstmalig instanziert wird. * $var = new MeineKlasse; => Es wird nach der Datei class_MeineKlasse.php gesucht * Die Suche erfolgt rekursiv in allen Unterordnern ausgehend von dem Ordner, in dem * das aufrufende PHP-Script liegt. * * Michael Hutter / Dezember 2017 */ function AutoLoadClasses($Klassenname, $StartOrdner = null) { if (is_null($StartOrdner)) { $StartOrdner = __DIR__; # Ausgangspunkt für die Suche: Ordner, in dem sich das aufrufende PHP-Script befindet $StartInstanz = true; } $ZielDateiname = "class_$Klassenname.php"; $FileList = scandir($StartOrdner, 1); # Sortierung 1 => kommt schneller zum Ziel, falls Ordnernamen im allgemeinen mit einem Großbuchstaben beginnen foreach ($FileList as $file) # Alle Dateien und Ordner durchgehen { $Vollpfad = $StartOrdner.DIRECTORY_SEPARATOR.$file; if (is_dir($Vollpfad) && (substr($file, 0, 1) !== ''.'')) # Ordner? { #echo "Ordner $StartOrdner<br>"; $result = AutoLoadClasses($Klassenname, $Vollpfad); if ($result) return; # Abbruch, falls Ziel gefunden } else if (preg_match(''//.php$/i'' , $file)) # .php-Datei? { #echo "$file<br>"; if ($file == $ZielDateiname) # Dateiname entspricht Klassenname? { include $Vollpfad; return true; # Abbruch aller Rekursionen, da Ziel gefunden } } } if (isset($StartInstanz)) die("<table border bgcolor=red><tr><td>Fehler: Die Datei <b>$ZielDateiname</b> konnte in keinem der Unterordner gefunden werden!</td></tr></table>"); return false; } ?>


Podrías usar:

set_include_path(implode(PATH_SEPARATOR, array(get_include_path(), ''./services'', ''./vos'', ''./printers''))); spl_autoload_register();

El uso de spl_autoload_register sin argumentos registrará spl_autoload que buscará el nombre de la clase en los directorios de la include path . Tenga en cuenta que esto minúscula el nombre de la clase antes de buscarlo en el sistema de archivos.


Si se suponía que debía refactor your code , sería

function custom_autoload($class_name){ $dirs = array(''services'',''vos'',''printers'') foreach($dirs as $dir){ $file = $dir.''/''.$class_name. ''.php''; if (file_exists($file)){ require $file; break; // if i have maintained naming conventions as per dir as there // is no point for looking eg: sample1_printer.php in the vos/ // or printer/. this way iam avoiding unnecessary loop } } } spl_autoload_register(''custom_autoload'');