PHP에서 SPL_AUTOLOAD_REGISTER 및 SPL_AUTOLOAD_UNREGISTE는 클래스를위한 자동 로더를 관리하는 강력한 메커니즘을 제공합니다. 그러나 복잡한 프로젝트 또는 프레임 워크에서는 자동 로더가 실패하거나 복제 등록 또는 예상치 못한 제거가있을 수 있습니다. 이 기사는 핵심 문제에 중점을 둘 것입니다.
spl_autoload_register () 에 자동로드 함수를 등록 할 때 이러한 함수는 내부 기능 스택에 저장됩니다. 정의되지 않은 클래스라고 불리는 경우에만 PHP 가이 자동 로더를 호출하여로드하려고합니다.
SPL_AUTOLOAD_FUNCTIONS () 를 통해 현재 등록 된 자동 로더 목록을 볼 수 있습니다.
$autoloaders = spl_autoload_functions();
print_r($autoloaders);
이 함수는 익명 함수, 클래스 방법 (정적 및 비 정적) 등을 포함하여 등록 된 모든 자동 로더를 나열하는 배열을 반환합니다.
자동 로더가 여전히 있는지 여부를 결정하는 가장 직접적인 방법은 SPL_Autoload_Functions () 에 의해 반환 된 결과와 비교하는 것입니다. 다음과 같은 등록 된 로더가 있다고 가정합니다.
function myAutoloader($class) {
include 'classes/' . $class . '.class.php';
}
spl_autoload_register('myAutoloader');
우리는 이런 식으로 판단 할 수 있습니다.
$autoloaders = spl_autoload_functions();
$isRegistered = false;
foreach ($autoloaders as $loader) {
if ($loader === 'myAutoloader') {
$isRegistered = true;
break;
}
}
echo $isRegistered ? '등기' : '등록되지 않았습니다';
로더가 등록되어 제거하고 싶을 때 SPL_AUTOLOAD_UNREGISTER를 사용할 수 있습니다.
if ($isRegistered) {
spl_autoload_unregister('myAutoloader');
}
이 기능은 로더가 등록되지 않았을 때 호출되며 경고를 유발합니다. 따라서 오류를 피하기 위해 먼저 판단 한 다음 제거하는 것이 가장 좋습니다.
등록 형식의 클래스 메소드 (예 : [classname, 'methodname'] ) 또는 객체 방법의 경우 판단 방법도 더 자세히 설명해야합니다. 예를 들어:
class MyLoader {
public static function load($class) {
include 'libs/' . $class . '.php';
}
}
spl_autoload_register(['MyLoader', 'load']);
그러한 로더가 존재하는지 여부를 결정하려면 다음을 수행 할 수 있습니다.
$autoloaders = spl_autoload_functions();
foreach ($autoloaders as $loader) {
if (is_array($loader) && $loader[0] === 'MyLoader' && $loader[1] === 'load') {
echo "MyLoader::load 등기";
}
}
익명 기능은 이름이 없기 때문에 전통적인 방식으로 비교할 수 없습니다. 현재 SPL_Autoload_Functions ()가 반환 한 컨텐츠를 사용하여 일부 클로저 기능 구조 판단을 할 수 있지만 제거하려면 일반적으로 등록 중에 참조를 수동으로 기록해야합니다. 예를 들어:
$anonLoader = function($class) {
include 'includes/' . $class . '.php';
};
spl_autoload_register($anonLoader);
// 제거 할 때 원래 참조가 필요합니다
spl_autoload_unregister($anonLoader);
로더 상태를 빠르게 디버깅하고 싶습니까? 디버깅 기능을 작성하십시오.
function dumpAutoloaders() {
echo "<pre>";
foreach (spl_autoload_functions() as $loader) {
if (is_string($loader)) {
echo "Function: $loader\n";
} elseif (is_array($loader)) {
echo "Method: " . (is_object($loader[0]) ? get_class($loader[0]) : $loader[0]) . "::{$loader[1]}\n";
} elseif ($loader instanceof Closure) {
echo "Closure\n";
}
}
echo "</pre>";
}
예를 들어 디버그 배경에 통합하십시오.
// gitbox.net/tools/debug.php
require 'debug_tools.php';
dumpAutoloaders();
따라서 현재 등록 된 로더를 쉽게 확인할 수 있습니다.
자동 로더가 존재하는지 여부를 결정하려면 SPL_Autoload_Functions ()가 반환 한 목록을 사용하여 정확한 판단을 달성하기 위해 적절한 조건부 구조와 비교하고 결합 할 수 있습니다. 직접 판단 할 수없는 일부 익명 기능의 경우, 후속 판단 또는 취소를 위해 등록 중에 참조를 저장할 수 있습니다. 합리적인 사용의 전제로 SPL_Autoload_unregister는 유효하지 않거나 상충되는 로더를 효과적으로 정리하여 시스템 견고성과 유지 관리를 향상시킬 수 있습니다.