SPL_autoload_register peut enregistrer une ou plusieurs fonctions Autoload. Lorsque vous instanciez une classe non chargée, PHP appelle l'autoloader enregistré à son tour jusqu'à ce que la définition de la classe soit trouvée ou que tous les autoloaders échouent.
spl_autoload_register('myAutoload1');
spl_autoload_register('myAutoload2');
function myAutoload1($class) {
// Essayez de charger la classe
}
function myAutoload2($class) {
// Essayez de charger la classe
}
PHP appelle l'autoloader en séquence par ordre d'enregistrement par défaut.
L'ordonnance d'enregistrement par défaut est l'ordre d'appel. Si vous souhaitez ajuster la priorité, vous ne pouvez le contrôler que par le biais de l'ordre d'enregistrement - l'appel de priorité qui enregistre d'abord et l'appel ultérieur qui enregistre plus tard.
Cependant, si l'enregistrement du chargeur automatique dans le programme est dispersé à différents modules et points temporels différents, et que l'ordre d'enregistrement ne peut pas être garanti, la gestion prioritaire se complique.
PHP 5.3.0 introduit le troisième paramètre $ prend de SPL_autoload_register , qui est utilisé pour déterminer si l'autoloader est placé à l'extrémité avant de la pile d'appel.
spl_autoload_register('highPriorityLoader', true, true); // Priorité la plus élevée
spl_autoload_register('lowPriorityLoader', true, false); // Faible priorité
Ici, le Highprirityloader sera appelé d'abord sur le LowPriorityLoader .
Exemple:
function highPriorityLoader($class) {
echo "High priority loader trying to load $class\n";
// pseudocode:Logique de chargement
}
function lowPriorityLoader($class) {
echo "Low priority loader trying to load $class\n";
// pseudocode:Logique de chargement
}
spl_autoload_register('lowPriorityLoader');
spl_autoload_register('highPriorityLoader', true, true);
new SomeClass; // Le chargement automatique sera appelé en premier highPriorityLoader
S'il y a plusieurs autoloaders et que la priorité est complexe, vous pouvez encapsuler un "gestionnaire automatique" et maintenir une liste de chargement automatique avec la priorité en interne pour gérer l'ordre d'appel uniformément.
Exemple de code:
class AutoloadManager {
protected static $loaders = [];
// Enregistrer un autoloader,priority Plus la valeur est élevée, plus la priorité est élevée
public static function registerLoader(callable $loader, int $priority = 0) {
self::$loaders[] = ['loader' => $loader, 'priority' => $priority];
// Trier par priorité,Classement de grande priorité
usort(self::$loaders, function($a, $b) {
return $b['priority'] <=> $a['priority'];
});
self::refreshAutoloaders();
}
// Réenregistrer tous les autoloaders pour SPL,Assurer l'ordre de l'appel
protected static function refreshAutoloaders() {
// 先清除所有已Enregistrer un autoloader(Seulement pour le gestionnaire actuel)
foreach (spl_autoload_functions() as $func) {
if (is_array($func) && $func[0] === __CLASS__) {
spl_autoload_unregister($func);
}
}
// Enregistrez tous les autoloaders autorités
foreach (self::$loaders as $item) {
spl_autoload_register($item['loader']);
}
}
}
// Échantillon
function loaderA($class) {
echo "Loader A trying $class\n";
}
function loaderB($class) {
echo "Loader B trying $class\n";
}
// Définir la priorité lors de l'enregistrement
AutoloadManager::registerLoader('loaderA', 5);
AutoloadManager::registerLoader('loaderB', 10);
new TestClass;
De cette façon, via AutoloAdManager , nous pouvons augmenter et ajuster dynamiquement les priorités pour réaliser une gestion unifiée des chargeurs automatiques.
SPL_AUTOLOAD_REGISTER prend en charge plusieurs autoloaders à appeler dans l'ordre dans l'ordre d'enregistrement.
Un contrôle de priorité simple peut être obtenu en utilisant le troisième paramètre $ prend .
Des scénarios plus complexes suggèrent les gestionnaires d'encapsulation, le maintien des files d'attente prioritaires et le contrôle dynamiquement de l'ordre d'enregistrement.
Cela garantit que la logique de chargement est claire et flexible dans un environnement multi-autoloader.
En gérant raisonnablement la priorité des chargeurs automatiques, la maintenabilité et l'évolutivité de la structure du code peuvent être efficacement améliorées, ce qui est une compétence clé pour la conception automatique de chargement dans des projets à grande échelle.
<?php
// Exemple simple,Contrôle prioritaire
function loaderLow($class) {
echo "Low priority loader: $class\n";
}
function loaderHigh($class) {
echo "High priority loader: $class\n";
}
spl_autoload_register('loaderLow');
spl_autoload_register('loaderHigh', true, true);
new SomeClass;
?>
Pour plus de compétences de chargement automatique PHP, veuillez visiter https://gitbox.net/php-autoload-guide