>백엔드 개발 >PHP 튜토리얼 >PHP의 자동로드 작동 메커니즘 분석 예_php 기술

PHP의 자동로드 작동 메커니즘 분석 예_php 기술

WBOY
WBOY원래의
2016-05-16 20:36:431109검색

이 기사에서는 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 프로그래밍에 도움이 되기를 바랍니다

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