> 백엔드 개발 > PHP 튜토리얼 > PHP7 커널 분석 6 기능

PHP7 커널 분석 6 기능

不言
풀어 주다: 2023-03-23 18:06:01
원래의
1556명이 탐색했습니다.

이 글의 내용은 PHP7 커널 분석 6의 기능에 관한 것입니다. 이제 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

1. 함수의 저장 구조

typedef union  _zend_function        zend_function;

union _zend_function {
    zend_uchar type;    
    struct {
        zend_uchar type; 
        zend_uchar arg_flags[3];
        uint32_t fn_flags;
        zend_string *function_name;
        zend_class_entry *scope; //成员方法所属类,面向对象实现中用到
        union _zend_function *prototype;
        uint32_t num_args; //参数数量
        uint32_t required_num_args; //必传参数数量
        zend_arg_info *arg_info; //参数信息
    } common;
    zend_op_array op_array; //自定义函数(函数实际编译为普通的zend_op_array)
    zend_internal_function internal_function; //内部函数(通过扩展或者内核提供的C函数)
};
로그인 후 복사
zend_function.common.xx快速访问到zend_function.zend_op_array.xx及zend_function.zend_internal_function.xx
zend_function.type取到zend_function.op_array.type及zend_function.internal_function.type
로그인 후 복사

PHP7 커널 분석 6 기능

EG의 function_table 속성은 PHP


2. 함수 매개변수

커널 구현의 함수 매개변수는 실제로 함수의 로컬 변수와 동일합니다. 함수가 호출되면 먼저 매개변수 값을 호출 위치에 있는 각 매개변수의 해당 위치에 복사합니다.
//参数的额外信息
typedef struct _zend_arg_info {
    zend_string *name; //参数名
    zend_string *class_name;
    zend_uchar type_hint; //显式声明的参数类型,比如(array $param_1)
    zend_uchar pass_by_reference; //是否引用传参,参数前加&的这个值就是1
    zend_bool allow_null; //是否允许为NULL
    zend_bool is_variadic; //是否为可变参数,即...用法,function my_func($a, ...$b){...}
} zend_arg_info;
로그인 후 복사
위의 모든 매개변수 결과는 zend_op_array.arg_info 배열에 저장됩니다. 함수가 반환 값 유형을 선언하는 경우 이를 위해 zend_arg_info도 생성됩니다. 이 구조는 arg_info 배열에 있습니다. 이 경우 zend_op_array->arg_info는 실제로 배열의 두 번째 위치를 가리키며 반환 값의 구조는 zend_op_array를 통해 읽혀집니다. ->arg_info[-1]


3. 내부 함수

내부 함수는 커널 및 확장에서 제공하는 C 언어로 작성된 함수를 의미하며, 이러한 함수는 opcode 컴파일 과정을 거칠 필요가 없습니다. 그래서 PHP 사용자 정의 함수보다 더 효율적입니다. 호출할 때 일반 C 프로그램과 차이가 없습니다. Zend 엔진은 사용자가 PHP에서 사용할 수 있는 많은 내부 함수를 정의합니다(예: 정의, 정의, strlen, method_exists, class_exists, function_exists...등). Zend 엔진에 정의된 내부 함수 외에도 PHP 확장도 A 많은 내부 기능이 제공되며, 확장 기능을 통해 유연하게 맞춤화할 수도 있습니다.
//zend_internal_function头部是一个与zend_op_array完全相同的common结构
typedef struct _zend_internal_function {
    /* Common elements */
    zend_uchar type;
    zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
    uint32_t fn_flags;
    zend_string* function_name;
    zend_class_entry *scope;
    zend_function *prototype;
    uint32_t num_args;
    uint32_t required_num_args;
    zend_internal_arg_info *arg_info;
    /* END of common elements */

    void (*handler)(INTERNAL_FUNCTION_PARAMETERS); //函数指针,展开:void (*handler)(zend_execute_data *execute_data, zval *return_value)
    struct _zend_module_entry *module;
    void *reserved[ZEND_MAX_RESERVED_RESOURCES];
} zend_internal_function;
로그인 후 복사

관련 권장 사항:

PHP7 커널 분석 5 - PHP 코드 편집

PHP7 커널 분석 4 - 지역 변수, 전역 변수, 상수

PHP7 커널 분석 3 - 변수

   ~

위 내용은 PHP7 커널 분석 6 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿