함수의 정의는 함수 목록에 함수 이름을 등록하는 과정일 뿐입니다.
함수의 매개변수 확인은 zend_do_receive_arg 함수를 통해 구현되는 것으로 알고 있습니다. 이 함수의 매개변수에 대한 키 코드는 다음과 같습니다.CG(active_op_array)->arg_info = erealloc(CG(active_op_array)->arg_info, sizeof(zend_arg_info)*(CG(active_op_array)->num_args)); cur_arg_info = &CG(active_op_array)->arg_info[CG(active_op_array)->num_args-1]; cur_arg_info->name = estrndup(varname->u.constant.value.str.val, varname->u.constant.value.str.len); cur_arg_info->name_len = varname->u.constant.value.str.len; cur_arg_info->array_type_hint = 0; cur_arg_info->allow_null = 1; cur_arg_info->pass_by_reference = pass_by_reference; cur_arg_info->class_name = NULL; cur_arg_info->class_name_len = 0;
typedef struct _zend_arg_info { const char *name; /*参数的名称*/ zend_uint name_len; /*参数名称的长度*/ const char *class_name; /* 类名*/ zend_uint class_name_len; /*类名长度*/ zend_bool array_type_hint; /*数组类型提示*/ zend_bool allow_null; /*是否允许为NULLͺ*/ zend_bool pass_by_reference; /*是否引用传递*/ zend_bool return_reference; int required_num_args; } zend_arg_info;
CG(active_op_array)->num_args++;
cur_arg_info = &CG(active_op_array)->arg_info[CG(active_op_array)->num_args-1];
변수 매개변수를 사용할 수도 있습니다. 이번에는 func_num_args 및 func_get_args 함수를 사용하겠습니다. 내부 기능으로 존재합니다. 따라서 Zendzend_builtin_functions.c 파일에서 이 두 함수의 구현을 찾으세요. 먼저 func_num_args 함수의 구현을 살펴보겠습니다. 코드는 다음과 같습니다.
/* {{{ proto int func_num_args(void) Get the number of arguments that were passed to the function */ ZEND_FUNCTION(func_num_args) { zend_execute_data *ex = EG(current_execute_data)->prev_execute_data; if (ex && ex->function_state.arguments) { RETURN_LONG((long)(zend_uintptr_t)*(ex->function_state.arguments)); } else { zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context"); RETURN_LONG(-1); } } /* }}} */
zend_execute_data *ex = EG(current_execute_data)->prev_execute_data;
/* {{{ proto int count(mixed var [, int mode]) Count the number of elements in a variable (usually an array) */ PHP_FUNCTION(count) { zval *array; long mode = COUNT_NORMAL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE) { return; } ... //省略 }
#define ZEND_NUM_ARGS() (ht)
#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
ZEND_API int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...)
형식화된 문자열과 다소 유사합니다.
나머지 매개변수는 PHP 매개변수 값을 수신하는 데 사용하는 변수에 대한 포인터입니다. zend_parse_parameters()는 매개변수를 구문 분석하는 동안 매개변수 유형을 최대한 많이 변환하여 항상 예상 유형의 변수를 얻을 수 있도록 합니다위 내용은 PHP 사용자 정의 함수의 매개변수 전달에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!