여러 타사 라이브러리 또는 프레임 워크를 프로젝트에 소개한다고 가정 해 봅시다.
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_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_UNREGISTER 및 SPL_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();