Die Definition einer Funktion ist lediglich ein Prozess der Registrierung des Funktionsnamens in der Funktionsliste.
1. Parameter der benutzerdefinierten Funktion
Wir wissen, dass die Parameterprüfung der Funktion durch die Funktion zend_do_receive_arg implementiert wird Parameter ist wie folgt: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];
variable Parameter verwenden. Zu diesem Zeitpunkt werden wir die Funktionen func_num_args und func_get_args verwenden. Sie existieren als interne Funktionen. Suchen Sie also die Implementierung dieser beiden Funktionen in der Datei Zendzend_builtin_functions.c. Schauen wir uns zunächst die Implementierung der Funktion func_num_args an. Der Code lautet wie folgt:
/* {{{ 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, ...)
formatierten Zeichenfolge , die das Ausgabeformat in printf angibt.
Die übrigen Parameter sind Zeiger auf Variablen, die wir zum Empfangen von PHP-Parameterwerten verwenden. zend_parse_parameters() konvertiert den Parametertyp beim Parsen der Parameter so weit wie möglich, um sicherzustellen, dass wir immer den erwarteten Variablentyp erhalten könnenDas obige ist der detaillierte Inhalt vonVertiefte Kenntnisse der Parameterübergabe von benutzerdefinierten PHP-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!