


In-depth understanding of parameter passing of PHP custom functions
The definition of a function is just a process of registering the function name to the function list.
1. User Parameters of custom function
We know that the parameter check of the function is implemented through the zend_do_receive_arg function. In this function, the key code for the parameters is As follows:
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;
The entire parameter transfer is completed by performing an assignment operation to the arg_info field of the intermediate code. The key point is in the arg_info field. The structure of the arg_info field is as follows:
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;
The difference between parameter value passing and parameter passing is achieved through the pass_by_reference parameter when generating intermediate code.
Regarding the number of parameters, the arg_nums field contained in the intermediate code will be increased by 1 every time **zend_do_receive_argxx is executed. The following code:
CG(active_op_array)->num_args++;
And the index of the current parameter is CG( active_op_array)->num_args-1. The following code:
cur_arg_info = &CG(active_op_array)->arg_info[CG(active_op_array)->num_args-1];
The above analysis is for the parameter settings when the function is defined, and these parameters are fixed. When actually writing a program, we may use variable parameters. At this time we will use the functions func_num_args and func_get_args. They exist as internal functions. So find the implementation of these two functions in the Zend\zend_builtin_functions.c file. Let’s first look at the implementation of the func_num_args function. The code is as follows:
/* {{{ 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); } } /* }}} */
When ex->function_state.arguments exists and when the function is called, the converted value of ex->function_state.arguments is returned. , otherwise an error is displayed and -1 is returned. The most critical point here is EG (current_execute_data). This variable stores the data of the currently executing program or function. At this time, we need to get the data of the previous executing program. Why? Because the call of this function is executed after entering the function. The relevant data of the function are all in the previous execution process, so what is called is:
zend_execute_data *ex = EG(current_execute_data)->prev_execute_data;
2. Parameters of the internal function
Taking the common count function as an example, the code for its parameter processing part As follows:
/* {{{ 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; } ... //省略 }
This includes two operations: one is to get the number of parameters, and the other is to parse the parameter list.
(1) Get the number of parameters
The number of parameters is achieved through the ZEND_NUM_ARGS() macro, which is defined as follows:
#define ZEND_NUM_ARGS() (ht)
ht is in Zend The ht in the macro INTERNAL_FUNCTION_PARAMETERS defined in the /zend.h file is as follows
#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
(2) Parse parameter list
PHP internal functions use zend_parse_parameters when parsing parameters. It can greatly simplify the work of receiving and processing parameters, although it is still a bit weak when dealing with variable parameters.
Its declaration is as follows:
ZEND_API int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...)
The first parameter num_args indicates the number of parameters you want to receive. We often use ZEND_NUM_ARGS() to express "as many parameters as you want" for the incoming parameters. ”
The second parameter should be the macro TSRMLS_CC.
The third parameter type_spec is a string used to specify the type of each parameter we expect to receive, somewhat similar to the formatting string that specifies the output format in printf.
The remaining parameters are pointers to the variables we use to receive PHP parameter values.
zend_parse_parameters() converts parameter types as much as possible while parsing parameters, so as to ensure that we can always get variables of the expected type
The above is the detailed content of In-depth understanding of parameter passing of PHP custom functions. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.
