php编写函数,php自定义函数的工作原理和结构化编程介绍

当且仅当函数被调用以后,函数中的代码语句才会被执行,其目的是为了完成一些特定的任务。而函数被执行完成以后,控制权将返回到调用函数的地方,函数就能够以返回值的方式将信息返回给程序。通过在程序中使用函数,可以进行结构化编程。在结构化编程中,各个任务使用独立的程序代码一段一段完成的。而函数正式实现这种 “ 独立的程勋代码段” 最理想的方式,所以函数和结构化编程的关系非常之密切。结构化编程之所以很优秀,是有其自己独特的理由的,主要还是如下的两个重要的原因:

1. 结构化程序更容易被编写,因为复杂的编程问题被划分为多个更小的、更简单的任务。每个任务由一个函数来完成,而函数中的代码和变量独立于程序的其他部分。通过每次处理一个简单的任务,编程的速度将会更加快捷。

2. 结构化程序更容易调试。如果程序中有一些无法正确运行的代码,结构化设计则使得将问题缩小到特定的单码段,比如一个特定的函数。这样调试错误修改就比较方便,自上到下,从左到右,一步一步按照顺序来进行即可。

结构化编程的一个显著的优点是可以节省时间。如果在一个程序中编写一个执行特定任务的函数,则可以在另一个需要执行相同任务的程序中使用它。即使心程序需要王城的任务稍微不同,但修改一个已有的函数比重新编写一个函数更容易。想想看,你经常使用使用 echo() 和 var_dump() , 虽然首先应该确认程序的功能,必须做一些规划,在规划中必须列出程序要执行的所有具体任务。然后使用函数编写每个具体的任务,在主程序中按执行顺序调用每个任务函数,就组成了一个完整的结构化程序。下面图中所示是一个包含三个函数的程序,其中每个函数都执行特定的任务,可以再主程序中调用一次或者多次。每当函数被调用时,控制权便被传递给函数。函数执行完毕后,控制权返回到调用该函数的位置

如下图所示:

edf3eb44c0b369fa122f4e5342be587d.png

php实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。Php本身是用c实现的,因此最终调用的也都是c的函数,实际上,我们可以把php看做是一个c开发的软件。通过上面描述不难看出,php中函数的执行也是被翻译成了opcodes来调用,每次函数调用实际上是执行了一条或多条指令。

对于每一个函数,zend都通过以下的数据结构来描述typedef union _zend_function {

zend_uchar type; /* MUST be the first element of this struct! */

struct {

zend_uchar type; /* never used */

char *function_name;

zend_class_entry *scope;

zend_uint fn_flags;

union _zend_function *prototype;

zend_uint num_args;

zend_uint required_num_args;

zend_arg_info *arg_info;

zend_bool pass_rest_by_reference;

unsigned char return_reference;

} common;

zend_op_array op_array;

zend_internal_function internal_function;

} zend_function;

typedef struct _zend_function_state {

HashTable *function_symbol_table;

zend_function *function;

void *reserved[ZEND_MAX_RESERVED_RESOURCES];

} zend_function_state;

其中type标明了函数的类型:用户函数、内置函数、重载函数。Common中包含函数的基本信息,包括函数名,参数信息,函数标志(普通函数、静态方法、抽象方法)等内容。另外,对于用户函数,还有一个函数符号表,记录了内部变量等,这个将在后面详述。 Zend维护了一个全局function_table,这是一个大的hahs表。函数调用的时候会首先根据函数名从表中找到对应的zend_function。当进行函数调用时候,虚拟机会根据type的不同决定调用方法, 不同类型的函数,其执行原理是不相同的 。

【相关教程推荐】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值