이 기사에서는 PHP의 자동 로드 작동 메커니즘에 대한 보다 심층적인 분석을 제공합니다. PHP의 동작원리를 깊이 이해하는데 도움이 됩니다. 구체적인 분석은 다음과 같습니다.
PHP에서 자동 로드를 구현하는 방법에는 두 가지가 있습니다.
1. Interceptor__autoload()
2. 전역 변수 함수 포인터 autoload_func를 지정된 함수로 설정합니다. 일반적으로 C 확장에 사용됩니다
기본적으로 전자는 후자를 통해 달성됩니다.
분석과정, PHP5.3.6 소스코드:
=>Zend/zend_vm_def.h 1894행
ZEND_VM_HANDLER(109,ZEND_FETCH_CLASS,...
=>zend_execute_API.c 라인 1526
zend_class_entry *zend_fetch_class(const char *class_name,...
=>zend_execute_API.c 라인 1564
if(zend_lookup_class_ex(클래스_이름,클래스_이름_len,...
=>zend_execute_API.c 라인 1039
ZEND_API int zend_lookup_class_ex(const char *na...
=>zend_execute_API.c 라인 1121
retval = zend_call_function(&fcall_info, &fcall_cache TSRMLS_CC);
=>zend_execute_API.c 758행
zend_call_function
이름에서 알 수 있듯이 zend_call_function의 주요 기능은 PHP 함수를 호출하는 것입니다. 해당 매개변수 fcall_info 및 fcall_cache는 각각 zend_fcall_info 및 zend_fcall_info_cache라는 두 가지 중요한 구조를 가리킵니다
zend_call_function의 주요 작업 흐름은 다음과 같습니다.
fcall_cache.function_handler가 NULL이 아닌 경우 fcall_cache.function_handler가 가리키는 함수를 직접 실행하세요.
fcall_cache.function_handler가 NULL이면 fcall_info.function_name이라는 함수를 찾아보고, 있으면 실행하세요.
자동 로드 메커니즘의 주요 실행 프로세스를 요약하면 다음과 같습니다.
(1) 실행기 전역 변수 함수 포인터 autoload_func가 NULL인지 확인합니다.
(2) autoload_func가 NULL이 아니면 autoload_func 포인터가 가리키는 함수가 직접 실행되어 __autoload() 함수 정의 여부를 확인하지 않고 클래스를 로드합니다.
(3) autoload_func가 NULL인 경우 시스템에 __autoload() 함수가 정의되어 있는지 확인합니다. 정의되지 않은 경우 오류가 보고되고 종료됩니다. __autoload() 함수가 정의된 경우 __autoload()가 실행되어 클래스 로드를 시도하고 로드 결과가 반환됩니다.
자동 로딩은 객체 지향 및 코드 재사용을 용이하게 하지만 여러 클래스 라이브러리의 서로 다른 __autoload는 혼란을 야기할 수 있습니다. 이는 다양한 개발자의 인터셉터 기능을 자동 로딩 기능의 해시테이블에 등록하는 spl_autoload로 해결될 수 있습니다. 자동 로딩을 구현하는 spl의 메커니즘은 자동 로딩 기능과 함께 다양한 기능을 저장하는 해시테이블을 유지하는 것입니다.
자동 로딩 메커니즘이 트리거되면 zend는 클래스가 성공적으로 로드되거나 로딩 실패 후 반환될 때까지 이 해시테이블의 함수를 탐색하고 실행합니다.
자동 로드 기능을 사용해야 하는 경우 spl_autoload_register() 또는 spl_autoload_register('autoloadfuncitonname') 함수를 사용하세요
매개변수가 없는 spl_autoload_register()는 기본적으로 spl_autoload() 함수를 로드합니다. 이 함수는 기능이 제한되어 있으며 inlcude_path에 지정된 확장자를 가진 클래스 라이브러리만 검색할 수 있습니다.
매개변수가 있는 spl_autoload_register()는 더 이상 기본적으로 spl_autoload() 함수를 로드하지 않습니다.
배열을 반환하는 spl_autoload_functions()를 통해 현재 자동 로드 해시테이블의 함수를 볼 수 있습니다.
참고: spl_autoload를 사용할 때 시스템은 spl_autoload_register('__autoload')를 사용하여 해시 테이블에 명시적으로 추가되지 않는 한 인터셉터 __autoload를 무시합니다
이 기사가 모든 사람의 PHP 프로그래밍에 도움이 되기를 바랍니다