현재 위치: > 최신 기사 목록> Autoloader 충돌 해결을위한 팁 : SPL_AUTOLOAD_UNREGISTER를 SPL_Autoload_register와 결합하십시오

Autoloader 충돌 해결을위한 팁 : SPL_AUTOLOAD_UNREGISTER를 SPL_Autoload_register와 결합하십시오

gitbox 2025-05-26

자동 로더 충돌의 일반적인 시나리오

여러 타사 라이브러리 또는 프레임 워크를 프로젝트에 소개한다고 가정 해 봅시다.

 spl_autoload_register(function ($class) {
    // 첫 번째 자동 로더,프로젝트로드를 담당하는 클래스
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
});

spl_autoload_register(function ($class) {
    // 두 번째 자동 로더,타사 라이브러리를로드하는 클래스
    $file = __DIR__ . '/vendor/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
});

이 두 오토 로더는 PHP에 의해 차례로 호출되어 클래스 파일을로드하려고 시도합니다.이 파일은 일반적으로 정상적으로 작동합니다. 그러나 예외 또는 데드 루프를 던지는 것과 같은 자동 로더의 로딩 로직에 문제가있는 경우 후속 로더를 실행할 수 없어 충돌이 발생합니다.


spl_autoload_unregister 및 spl_autoload_register의 역할

  • SPL_AUTOLOAD_REGISTER : 자동 부로 큐에 새 자동 자동 기능을 등록하십시오. 현재 자동로드 함수 목록의 끝에 추가됩니다.

  • SPL_AUTOLOAD_UNREGISTER : 기능이 호출되는 것을 방지하기 위해 자동로드 큐에서 지정된 자동로드 함수에서 로그 아웃하십시오.

이 두 기능을 통해 충돌을 피하기 위해 자동 로더를 선택적으로 활성화 또는 비활성화 할 수 있습니다.


실제 전투 : 충돌을 피하기 위해 자동 로더를 동적으로 전환

자동 로더가 다른 자동 장비와 충돌한다고 가정하면 전화하기 전에 로그 아웃하고 전화 후 다시 등록 할 수 있습니다.

 // 定义첫 번째 자동 로더
$loader1 = function ($class) {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

// 定义두 번째 자동 로더
$loader2 = function ($class) {
    $file = __DIR__ . '/vendor/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

// 두 개의 자동 로더를 등록하십시오
spl_autoload_register($loader1);
spl_autoload_register($loader2);

// 특정 코드가 실행될 때,我们暂时注销두 번째 자동 로더,갈등을 피하십시오
spl_autoload_unregister($loader2);

// 这里执行只依赖첫 번째 자동 로더的代码
$obj = new SomeClassFromSrc();

// 실행이 완료되었습니다,重新注册두 번째 자동 로더
spl_autoload_register($loader2);

// 후속 코드는 두 개의 자동 로더를 계속 사용할 수 있습니다
$obj2 = new SomeClassFromVendor();

이것의 장점은 자동 로더의 시작과 정지를 유연하게 제어하여 동시에 실행 중 충돌로 인한 문제를 피하는 것입니다.


요약

자동로드 충돌은 다중 자동 환경에서 더 일반적입니다. PHP의 SPL_AUTOLOAD_UNREGISTERSPL_AUTOLOAD_REGISTER 기능을 사용하면 자동 로더의 활성화 상태를 유연하고 동적으로 관리하여 다른 모듈의로드 로그가 서로 방해하지 않도록 할 수 있습니다.

실제 개발에서 비슷한 문제가 발생하면 코드가 원활하게로드되도록 위의 아이디어를 시도해 볼 수도 있습니다.


 // 샘플 코드
$loader1 = function ($class) {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

$loader2 = function ($class) {
    $file = __DIR__ . '/vendor/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) {
        require_once $file;
    }
};

spl_autoload_register($loader1);
spl_autoload_register($loader2);

// 需要只使用첫 번째 자동 로더时
spl_autoload_unregister($loader2);

$obj = new SomeClassFromSrc();

spl_autoload_register($loader2);

$obj2 = new SomeClassFromVendor();