현재 위치: > 최신 기사 목록> spl_autoload_unregister를 피하는 방법 잘못된 로더를 제거합니다

spl_autoload_unregister를 피하는 방법 잘못된 로더를 제거합니다

gitbox 2025-05-26

PHP에서 SPL_Autoload_register는 클래스의 자동로드 기능을 동적으로 등록하는 강력한 메커니즘을 제공하는 반면 SPL_Autoload_unregister는 이러한 등록 된 로더를 제거하는 데 사용됩니다. 그러나 spl_autoload_unregister를 잘못 사용하면 심각한 문제가 발생할 수 있습니다. 특히 취소되지 않아야 할 로더를 실수로 제거 할 때 전체 애플리케이션의 자동로드 메커니즘이 손상 될 수 있습니다.

이 기사에서는 SPL_Autoload_unregister를 사용할 때 제거해서는 안되는 로더를 신중하게 식별하고 제거하는 방법을 설명합니다.

로더 유형

spl_autoload_unregister를 사용하기 전에 먼저 시스템에 등록 될 수있는 몇 가지 로더 유형을 이해해야합니다.

  1. 익명 함수 : 클로저에 정의 된 로더는 단순히 함수 이름을 비교하여 식별 할 수 없습니다.

  2. functions/methods : 일반적으로 "myclass :: load" 문자열과 같이 프로젝트에 자체적으로 등록 된 로더.

  3. 프레임 워크/작곡가 자동 로더 :이 로더는 일반적으로 외부 라이브러리 또는 자동으로 생성되며 임의의 제거로 인해 전체 프로젝트가 실행되지 않을 수 있습니다.

SPL_AUTOLOAD_UNREGISTER를 안전하게 사용하는 방법

1 단계 : 현재 등록 된 모든 로더를 봅니다

SPL_AUTOLOAD_FINCTIONS를 사용하여 모든 현재 로더를 나열하면 리턴은 배열입니다.

 $autoloaders = spl_autoload_functions();
print_r($autoloaders);

출력은 다음과 같습니다.

 Array
(
    [0] => Array
        (
            [0] => Composer\Autoload\ClassLoader Object
            [1] => loadClass
        )

    [1] => 'my_autoloader_function'
)

이 단계는 매우 중요하며 프레임 워크 또는 라이브러리 자체에 의해 등록되는 로더를 식별하고 우리 자신의 로더인지 식별 ​​할 수 있습니다.

2 단계 : 사용자 정의 로더를 식별합니다

등록한 로더 만 제거하려면 의식적으로 자신의 로더를 관리해야합니다. 예를 들어, 나중에 사용하기 위해 등록 할 때 변수로 저장해야합니다.

 function myCustomLoader($class) {
    // 로드로드
}

spl_autoload_register('myCustomLoader');

// 미래를 취소 해야하는 경우,명시 적으로 로그 아웃 할 수 있습니다
spl_autoload_unregister('myCustomLoader');

다음을 피하십시오.

 $loaders = spl_autoload_functions();
foreach ($loaders as $loader) {
    spl_autoload_unregister($loader);
}

이 쓰기는 작곡가만큼 중요한 시스템 로더를 포함한 모든 로더를 제거합니다.

3 단계 : 객체 방법에 대한 보안 검사를 수행하십시오

객체 방법 (예 : 작곡가)의 형태로 로더를 제거할지 여부를 동적으로 결정 해야하는 경우 객체의 클래스 이름을 판단하여 제외 할 수 있습니다.

 $loaders = spl_autoload_functions();

foreach ($loaders as $loader) {
    if (is_array($loader) && is_object($loader[0])) {
        $class = get_class($loader[0]);
        if ($class === 'Composer\Autoload\ClassLoader') {
            // 제거하지 마십시오 Composer 짐을 싣는 사람
            continue;
        }
    }

    spl_autoload_unregister($loader);
}

제안 : 명시 적으로 자신의 로더를 관리합니다

실수로 다른 로더를 삭제하지 않으려면 가장 좋은 방법은 "등록한 로더 만 제거하고 로더를 등록 할 때 명확한 레코드를 만드는 것입니다. 다음 관리 방법을 사용할 수 있습니다.

 $myLoaders = [];

$myLoaders[] = function ($class) {
    require __DIR__ . '/lib/' . $class . '.php';
};

foreach ($myLoaders as $loader) {
    spl_autoload_register($loader);
}

// 로그 아웃 할 때
foreach ($myLoaders as $loader) {
    spl_autoload_unregister($loader);
}

결론

SPL_AUTOLOAD_UNREGISTER 는 개발자에게 더 많은 유연성을 제공하는 "양날의 소드"이지만 쉽게 파괴력을 이끌어냅니다. 그것을 사용할 때 어떤 로더를 제거했는지 확인하십시오. 직접 등록하는 것이 가장 좋습니다. 작곡가를 통해로드 된 클래스와 같은 시스템 또는 프레임 워크 로더의 경우 쉽게 제거해서는 안됩니다.

명확하고 명확하며 제어 가능한 자동 부하 관리는 강력한 PHP 응용 프로그램을 구축하는 초석이라는 것을 항상 기억하십시오.

Composer Loader에 대한 자세한 내용은 공식 문서 또는 소스 코드를 참조하십시오 : https://gitbox.net/composer