在上一节中,分析了函数的定义,
函数的定义只是将函数名注册到函数列表的过程.
下面继续分析函数的参数.
如果没有看就移步到>>原:PHP内核研究
函数的定义,
,
function $test($arg=11){
}
还是要看Lex的语法分析
[c]
unticked_function_declaration_statement:
function is_reference T_STRING { zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); }
'(' parameter_list ')' '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); }
[/c]
parameter_list 就是分析参数的地方
经过分析找到了解析参数的函数
zend_do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, &$1, &$2, 0 TSRMLS_CC);
这里先要说一下 用来保存函数的结构体zend_arg_info
[c]
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; //参数是否允许为空
zend_bool pass_by_reference; //参数是否为引用 也就是有没有使用&
zend_bool return_reference; //函数自身是否是一个引用函数
int required_num_args; //最少传递几个参数
} zend_arg_info;
[/c]
zend_do_receive_arg定义在Zend/zend_compile.c中
[c]
void zend_do_receive_arg(zend_uchar op, const znode *var, const znode *offset, const znode *initialization, znode *class_type, const znode *varname, zend_uchar pass_by_reference TSRMLS_DC) /* {{{ */
{
zend_op *opline;
zend_arg_info *cur_arg_info;//声明一个函数结构指针
if (class_type->op_type == IS_CONST && //这里是类相关处理 暂时跳过 讲到类的时候再细说
跳过....
}
if (var->op_type == IS_CV &&
var->u.var == CG(active_op_array)->this_var &&
(CG(active_op_array)->fn_flags & ZEND_ACC_STATIC) == 0) {
zend_error(E_COMPILE_ERROR, "Cannot re-assign $this");
} else if (var->op_type == IS_VAR &&
CG(active_op_array)->scope &&
((CG(active_op_array)->fn_flags & ZEND_ACC_STATIC) == 0) &&
(Z_TYPE(varname->u.constant) == IS_STRING) &&
(Z_STRLEN(varname->u.constant) == sizeof("this")-1) &&
(memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this")) == 0)) {
zend_error(E_COMPILE_ERROR, "Cannot re-assign $this");
}
//创建一个op
opline = get_next_op(CG(active_op_array) TSRMLS_CC);
CG(active_op_array)->num_args++;//参数的个数
opline->opcode = op; //中间码 ZEND_RECV
opline->result = *var;//返回值
opline->op1 = *offset;
if (op == ZEND_RECV_INIT) {
opline->op2 = *initialization;
} else {
CG(active_op_array)->required_num_args = CG(active_op_array)->num_args;
SET_UNUSED(opline->op2);
}
//复制参数列表到arr_info
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_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;
//这个时候 cur_arg_info->name的值就是 $arg;也就是我们传递过来的参数名
if (class_type->op_type != IS_UNUSED) {//跳过
有略过....
}
opline->result.u.EA.type |= EXT_TYPE_UNUSED;
}
[/c]
如果函数有N个参数,那么 此函数就会执行N次
下一节将继续介绍 函数的返回值
原文出处:原:PHP内核研究
函数的参数
分享到:
相关推荐
### 深入理解PHP内核的关键知识点 #### 一、引言 《深入理解PHP内核—PHP宝典》是一本系统介绍PHP内部工作原理和技术细节的专业书籍。该书首次发布于2011年7月29日,旨在帮助开发者更深刻地理解PHP的运行机制,并为...
6. 函数的返回值和参数:主要学习函数的返回值的处理,以及如何解析函数的参数。 7. Array与HashTable:介绍数组在PHP内核中的表现形式,如何操作HashTable以及在内核中操作PHP语言中的数组。 8. PHP中的资源类型...
《深入理解PHP内核》是一本专为PHP开发者和爱好者量身打造的开源书籍,它深入探讨了PHP的内部机制,旨在帮助读者更好地理解和优化PHP应用程序。这本书涵盖了从基础到高级的各种主题,包括PHP的环境配置、源码解读、...
PHP7还引入了 scalar type hints,允许函数参数和返回值指定为 int, float, string 或 bool 类型,这有助于避免类型转换带来的潜在问题。同时,void 关键字用于表示函数没有返回值,增强了代码的可读性和规范性。 ...
### 深入PHP内核分析与讲解 #### 核心知识点详解 ##### 1. PHP内核概览 **标题**: “深入php内核分析与讲解” **描述**: “深入php内核分析,讲诉zend Engine工作原理,并附录php扩展开发图文教程” **关键词**:...
PHP内核和扩展开发是一个复杂但有趣的领域,它涉及到内存管理、数据结构、函数调用等多个层面。掌握这些知识不仅可以帮助开发者更有效地编写PHP扩展,还能深化对PHP内核的理解,提升编程技能。通过本文的详细介绍,...
5. **使用参数** - 处理函数接收的参数。 6. **标准方法与底层方法** - 实现模块启动、终止、资源管理等功能。 7. **引用传递** - 处理引用传递的情况。 8. **返回引用** - 返回一个引用到特定变量。 #### 扩展的...
《PHP扩展开发及内核应用》是一本深入探讨PHP扩展编程和PHP内核机制的书籍,基于Sara Golemon的《Extending and Embedding PHP》进行翻译和修订,主要面向那些希望深入了解PHP并可能想要为其开发自定义扩展的开发者...
《PHP-内核解析-深入PHP》这本书是针对PHP开发者深入理解PHP内核的重要参考资料,旨在帮助读者从底层原理的角度掌握PHP的运行机制。通过学习本书,你可以了解PHP的架构设计、内存管理、变量处理、函数调用、执行流程...
07.函数的参数.md 08.Array与HashTable.md 09.PHP中的资源类型.md 10.PHP中的面向对象上篇.md 11.PHP中的面向对象下篇.md 12.启动与终止的那点事.md 13.ini配置文件.md 14.流式访问.md 门 15.流的实现.md 16....
首先,文档标题“PHP内核学习.pdf”表明这是一份关于学习PHP内部机制和内核扩展的资料。而描述部分“PHP内核学习.pdf”也是对标题的重复,没有提供额外信息。标签“互联网”意味着这份资料可能和互联网技术相关,...
- 判断函数是否为内部函数(即是否由PHP内核提供)。 - **`public bool isUserDefined()`**: - 判断函数是否为用户自定义函数。 - **`public string getFileName()`**: - 获取函数所在的文件名及路径。 - **...
从实践出发,继弱类型变量原理探究后,王帅将继续...简单的讲,就像函数的输入和输出一样,我们通过Linux命令行执行一段PHP代码,本质是Linux的Shell通过PHP的SAPI传入一组参数,Zend引擎执行后,返回给shell,由shell
在PHP编程语言中,系统类函数是用于获取和操作PHP环境、配置以及系统信息的关键工具。下面我们将详细探讨这些函数的用途和用法。 1. **assert()**: 这个函数用于检查一个断言(assertion),即一个条件表达式。如果...
【标题】"基于PHP的2.3内核淡绿唯美小说网站PC+手机版源码.zip" 描述了一个使用PHP编程语言开发的网站源代码,它适用于个人电脑(PC)和移动设备,具备淡绿色调和唯美的设计风格,主要用于小说网站的搭建。...