>백엔드 개발 >PHP 튜토리얼 >php_php 스킬의 spl_autoload에 대한 자세한 설명

php_php 스킬의 spl_autoload에 대한 자세한 설명

WBOY
WBOY원래의
2016-05-16 20:34:41894검색

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를 구현하는 것과 동일합니다

코드 복사 코드는 다음과 같습니다.

함수 __autoload($classname){
If(is_file($classname.'.php'){
                    $classname.'.php';
포함             } elseif(is_file($classname.'.inc'){
                   $classname.'.inc' 포함;
}
}

등록 디렉토리에서 $classname과 동일한 이름을 가진 .php/.inc 파일을 자동으로 찾습니다. 물론

확장자를 등록하여 특정 유형의 파일을 지정할 수도 있습니다.

코드 복사 코드는 다음과 같습니다.

spl_autoload_extensions('.php,.inc,.some');

이렇게 하면 .some 파일도 검색됩니다. 기본적으로 PHP는 spl_autoload를 시작하지 않습니다. 그러면 어떻게 자동으로 spl_autoload를 적용할 수 있습니까? 방법은

코드 복사 코드는 다음과 같습니다.

spl_autoload_register();

spl_autoload_register에는 $callback 매개변수가 있습니다. 지정하지 않으면 자동으로 spl_autoload를 등록하여 더 많은 자동 로딩 디렉터리를 검색할 수 있으며, 이 코드 앞에 자동 로딩 디렉터리를 설정할 수 있습니다.

코드 복사 코드는 다음과 같습니다.
set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);

이런 방식으로 PHP가 지정된 클래스를 찾을 수 없으면 set_include_path에 지정된 디렉터리에서 검색합니다.

이러한 방법은 PHP 프레임워크에서 일반적으로 사용됩니다. 예를 들어 위의 소개를 함께 연결해 보세요.

코드 복사 코드는 다음과 같습니다.

set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);
spl_autoload_extensions('.php,.inc,.some');
spl_autoload_register();

some/path 아래에 classA 클래스를 로드하려는 경우 디렉토리에서 classa.php, classa.inc 또는 classa.some을 찾으므로 안전하게 새 classA를 사용하거나 classA를 확장할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

ClassB는 ClassA를 확장합니다. {
// 코드..
}

$a = 새로운 ClassA;
$b = 새로운 클래스B;

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.