SPL_AUTOLOAD_REGISTER는 하나 이상의 자동로드 함수를 등록 할 수 있습니다. 언로드 클래스를 인스턴스화하면 PHP는 클래스 정의가 발견되거나 모든 자동 로더가 실패 할 때까지 등록 된 자동 로더를 호출합니다.
spl_autoload_register('myAutoload1');
spl_autoload_register('myAutoload2');
function myAutoload1($class) {
// 수업을로드하십시오
}
function myAutoload2($class) {
// 수업을로드하십시오
}
PHP는 기본적으로 등록 순서대로 자동 로더를 순서대로 호출합니다.
기본 등록 주문은 통화 주문입니다. 우선 순위를 조정하려면 등록 주문 (먼저 등록하는 우선 순위 호출 및 나중에 등록하는 후속 통화를 통해서만 제어 할 수 있습니다.
그러나 프로그램의 자동 로더 등록이 다른 모듈과 다른 시점에 흩어져 있고 등록 순서를 보장 할 수없는 경우 우선 순위 관리가 복잡해집니다.
PHP 5.3.0은 SPL_Autoload_register 의 세 번째 매개 변수 $ prepend를 소개합니다. SPL_AUTOLOAD_REGISTER는 Autoloader가 통화 스택의 프론트 엔드에 배치되는지 여부를 결정하는 데 사용됩니다.
spl_autoload_register('highPriorityLoader', true, true); // 최우선 순위가 가장 높습니다
spl_autoload_register('lowPriorityLoader', true, false); // 우선 순위가 낮습니다
여기서는 높은 우선 순위 로더를 먼저 낮은 우선 순위 로 저명합니다.
예:
function highPriorityLoader($class) {
echo "High priority loader trying to load $class\n";
// 의사 코드:로드로드
}
function lowPriorityLoader($class) {
echo "Low priority loader trying to load $class\n";
// 의사 코드:로드로드
}
spl_autoload_register('lowPriorityLoader');
spl_autoload_register('highPriorityLoader', true, true);
new SomeClass; // 자동 로딩이 먼저 호출됩니다 highPriorityLoader
여러 개의 자동 로더가 있고 우선 순위가 복잡한 경우 "Autoloader Manager"를 캡슐화하고 내부적으로 우선 순위가있는 자동 로더 목록을 유지하여 통화 주문을 관리 할 수 있습니다.
샘플 코드 :
class AutoloadManager {
protected static $loaders = [];
// 자동 로더를 등록하십시오,priority 가치가 높을수록 우선 순위가 높아집니다
public static function registerLoader(callable $loader, int $priority = 0) {
self::$loaders[] = ['loader' => $loader, 'priority' => $priority];
// 우선 순위별로 정렬하십시오,우선 순위가 높습니다
usort(self::$loaders, function($a, $b) {
return $b['priority'] <=> $a['priority'];
});
self::refreshAutoloaders();
}
// 모든 자동 로더를 다시 등록하십시오 SPL,전화 순서를 확인하십시오
protected static function refreshAutoloaders() {
// 先清除所有已자동 로더를 등록하십시오(현재 관리자에게만)
foreach (spl_autoload_functions() as $func) {
if (is_array($func) && $func[0] === __CLASS__) {
spl_autoload_unregister($func);
}
}
// 우선 순위가 좋은 모든 자동 로더를 등록하십시오
foreach (self::$loaders as $item) {
spl_autoload_register($item['loader']);
}
}
}
// 샘플 자동 로더
function loaderA($class) {
echo "Loader A trying $class\n";
}
function loaderB($class) {
echo "Loader B trying $class\n";
}
// 등록시 우선 순위를 설정합니다
AutoloadManager::registerLoader('loaderA', 5);
AutoloadManager::registerLoader('loaderB', 10);
new TestClass;
이러한 방식으로 Autoloadmanager를 통해 자동 로더의 통합 관리를 달성하기 위해 우선 순위를 동적으로 늘리고 조정할 수 있습니다.
SPL_AUTOLOAD_REGISTER는 등록 명령으로 순서대로 여러 오토 로더를 호출하도록 지원합니다.
세 번째 매개 변수 $ propend를 사용하여 간단한 우선 순위 제어를 달성 할 수 있습니다.
보다 복잡한 시나리오는 캡슐화 관리자, 우선 순위 대기열을 유지하며 등록 순서를 동적으로 제어하는 것을 제안합니다.
이렇게하면 다중 자동 로더 환경에서 로딩 로직이 명확하고 유연 할 수 있습니다.
자동 로더의 우선 순위를 합리적으로 관리함으로써 코드 구조의 유지 관리 가능성과 확장 성을 효과적으로 개선 할 수 있으며, 이는 대규모 프로젝트의 자동 로딩 설계의 핵심 기술입니다.
<?php
// 간단한 예,우선 순위 제어
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;
?>
더 많은 PHP 자동 로딩 기술을 보려면 https://gitbox.net/php-autoload-guide를 방문하십시오