


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!

What’s still popular is the ease of use, flexibility and a strong ecosystem. 1) Ease of use and simple syntax make it the first choice for beginners. 2) Closely integrated with web development, excellent interaction with HTTP requests and database. 3) The huge ecosystem provides a wealth of tools and libraries. 4) Active community and open source nature adapts them to new needs and technology trends.

PHP and Python are both high-level programming languages that are widely used in web development, data processing and automation tasks. 1.PHP is often used to build dynamic websites and content management systems, while Python is often used to build web frameworks and data science. 2.PHP uses echo to output content, Python uses print. 3. Both support object-oriented programming, but the syntax and keywords are different. 4. PHP supports weak type conversion, while Python is more stringent. 5. PHP performance optimization includes using OPcache and asynchronous programming, while Python uses cProfile and asynchronous programming.

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

PHP originated in 1994 and was developed by RasmusLerdorf. It was originally used to track website visitors and gradually evolved into a server-side scripting language and was widely used in web development. Python was developed by Guidovan Rossum in the late 1980s and was first released in 1991. It emphasizes code readability and simplicity, and is suitable for scientific computing, data analysis and other fields.

PHP is suitable for web development and rapid prototyping, and Python is suitable for data science and machine learning. 1.PHP is used for dynamic web development, with simple syntax and suitable for rapid development. 2. Python has concise syntax, is suitable for multiple fields, and has a strong library ecosystem.

PHP remains important in the modernization process because it supports a large number of websites and applications and adapts to development needs through frameworks. 1.PHP7 improves performance and introduces new features. 2. Modern frameworks such as Laravel, Symfony and CodeIgniter simplify development and improve code quality. 3. Performance optimization and best practices further improve application efficiency.

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP type prompts to improve code quality and readability. 1) Scalar type tips: Since PHP7.0, basic data types are allowed to be specified in function parameters, such as int, float, etc. 2) Return type prompt: Ensure the consistency of the function return value type. 3) Union type prompt: Since PHP8.0, multiple types are allowed to be specified in function parameters or return values. 4) Nullable type prompt: Allows to include null values and handle functions that may return null values.


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

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SublimeText3 English version
Recommended: Win version, supports code prompts!

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

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

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

Atom editor mac version download
The most popular open source editor