이 글의 내용은 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
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 커널 분석 4 - 지역 변수, 전역 변수, 상수
~
위 내용은 PHP7 커널 분석 6 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!