SPL에는 spl_autoload와 spl_autoload_call이라는 두 가지 서로 다른 함수가 있습니다. autoload_func를 이 두 가지 함수 주소로 지정하여 서로 다른 자동 로딩 메커니즘을 구현합니다.
spl_autoload는 SPL에서 구현한 기본 자동 로딩 기능이며, 그 기능은 비교적 간단합니다. 두 개의 매개변수를 받을 수 있습니다. 첫 번째 매개변수는 클래스 이름을 나타내는 $file_extensions입니다. 두 번째 매개변수인 $file_extensions는 클래스 파일의 확장명을 나타냅니다. $file_extensions" title="Extension">확장자 이름에 여러 확장자를 지정하세요. 세미콜론으로 구분하세요. 지정하지 않으면 기본 확장자" title="Extension name"> 확장자를 사용합니다. .spl_autoload는 먼저 $class_name을 소문자로 변경한 다음 모든 포함 경로에서 $class_name.inc 또는 $class_name.php 파일을 검색합니다($file_extensions 매개변수가 지정되지 않은 경우). 발견되면 클래스 파일을 수동으로 로드할 수 있습니다. Person 클래스를 로드하려면 spl_autoload("Person", ".class.php")를 사용하십시오. 실제로 여러 확장을 지정할 수 있다는 점을 제외하면 require/include와 유사합니다.
spl_autoload가 자동으로 작동하도록 하는 방법, 즉 autoload_func에서 spl_autoload를 지정하는 방법은 무엇입니까? 대답은 spl_autoload_register 함수를 사용하는 것입니다. 매개 변수 없이 PHP 스크립트에서 처음으로 spl_autoload_register()를 호출하면 autoload_func에서 spl_autoload를 지정할 수 있습니다.
위의 설명을 통해 spl_autoload의 기능은 비교적 간단하고 SPL 확장에 구현되어 있으며 해당 기능을 확장할 수 없다는 것을 알 수 있습니다. 보다 유연한 자동 로딩 메커니즘을 구현하고 싶다면 어떻게 해야 할까요? 이때 spl_autoload_call 기능이 데뷔합니다.
먼저 spl_autoload_call 구현의 놀라운 기능을 살펴보겠습니다. SPL 모듈 내부에는 본질적으로 HashTable인 전역 변수 autoload_functions가 있지만 간단히 연결 목록으로 생각할 수 있습니다. 연결 목록의 각 요소는 다음과 같은 기능을 가진 함수를 가리키는 함수 포인터입니다. 자동으로 클래스를 로드하는 기능입니다. spl_autoload_call 구현 자체는 매우 간단하며, 단순히 연결 리스트에 있는 각 함수를 순서대로 실행한 후, 필요한 클래스가 로드되었는지 판단하여 로딩에 성공하면 바로 반환을 하게 됩니다. 연결된 목록의 다른 기능을 계속 실행합니다. 이 연결된 목록의 모든 함수가 실행된 후에도 클래스가 로드되지 않은 경우 spl_autoload_call은 사용자에게 오류를 보고하지 않고 직접 종료됩니다. 따라서 자동 로드 메커니즘을 사용한다고 해서 클래스가 자동으로 올바르게 로드되는 것은 아닙니다. 핵심은 여전히 자동 로드 기능이 구현되는 방식에 따라 달라집니다.
php5의 표준 라이브러리 메소드 spl_autoload는 자체 __autoload를 구현하는 것과 동일합니다
등록 디렉토리에서 $classname과 동일한 이름을 가진 .php/.inc 파일을 자동으로 찾습니다. 물론
확장자를 등록하여 특정 유형의 파일을 지정할 수도 있습니다.이렇게 하면 .some 파일도 검색됩니다. 기본적으로 PHP는 spl_autoload를 시작하지 않습니다. 그러면 어떻게 자동으로 spl_autoload를 적용할 수 있습니까? 방법은
spl_autoload_register에는 $callback 매개변수가 있습니다. 지정하지 않으면 자동으로 spl_autoload를 등록하여 더 많은 자동 로딩 디렉터리를 검색할 수 있으며, 이 코드 앞에 자동 로딩 디렉터리를 설정할 수 있습니다.
이런 방식으로 PHP가 지정된 클래스를 찾을 수 없으면 set_include_path에 지정된 디렉터리에서 검색합니다.
이러한 방법은 PHP 프레임워크에서 일반적으로 사용됩니다. 예를 들어 위의 소개를 함께 연결해 보세요.
some/path 아래에 classA 클래스를 로드하려는 경우 디렉토리에서 classa.php, classa.inc 또는 classa.some을 찾으므로 안전하게 새 classA를 사용하거나 classA를 확장할 수 있습니다.
$a = 새로운 ClassA;
$b = 새로운 클래스B;