zend_op_array.opcodes 指向指令列表,详细每一条指令的构造以下:
struct _zend_op { // *opline *opcodes const void *handler; //指令执行handler znode_op op1; //操作数1 znode_op op2; //操作数类型实际就是个32位整形,它次要用于存储一些变量的索引地位、数值记载等等 znode_op result; //前往值 uint32_t extended_value; uint32_t lineno; zend_uchar opcode; //opcode指令 zend_uchar op1_type; //操作数1类型 zend_uchar op2_type; zend_uchar result_type; //前往值类型 }; //操作数构造 //比方赋值语句:"$a = 45;",两个操作数辨别记载"$a"、"45"的存储地位,执行时依据op2取到值"45", //而后赋值给"$a",而"$a"的地位经过op1猎取到 //当然操作数并非全副这么用的,下面只是赋值时分的状况,其它操作会有没有同的用法 //如函数挪用时的传参,op1记载的就是通报的参数是第几个,op2记载的是参数的存储地位, //result记载的是函数接纳参数的存储地位。 typedef union _znode_op { //操作数类型实际就是个32位整形,它次要用于存储一些变量的索引地位、数值记载等等 uint32_t constant; //操作数记载着以后指令的要害信息, 能够用于变量的存储、拜访 uint32_t var; uint32_t num; uint32_t opline_num; /* Needs to be signed */ #if ZEND_USE_ABS_JMP_ADDR zend_op *jmp_addr; #else uint32_t jmp_offset; #endif #if ZEND_USE_ABS_CONST_ADDR zval *zv; #endif } znode_op;
//操作数有5种没有同的类型; #define IS_CONST (1<<0) //字面量,编译时就可确定且没有会扭转的值,比方:$a = "hello~",此中字符串"hello~"就是常量 #define IS_TMP_VAR (1<<1) //暂时变量 $a = "hello~" . time(),此中"hello~" . time()的值类型就是IS_TMP_VAR //"123" + $b的后果类型也是IS_TMP_VAR,从这两个例子能够猜想,暂时变量可能是执行时期其它 //类型组合现天生的一个两头值,因为它是现天生的,以是把IS_TMP_VAR赋值给IS_CV变量时没有会添加其援用计数 #define IS_VAR (1<<2)//PHP变量 //这个很容易以为是PHP剧本里的变量,并不是,这里PHP变量的含意能够这样了解:PHP变量是不显 //式的正在PHP剧本中界说的,没有是间接正在代码经过$var_name界说的 //。这个类型最多见的例子是PHP函数的前往值,再如$a[0]数组这类,它掏出的值也是IS_VAR,再比方$$a这类 #define IS_UNUSED (1<<3) /* Unused variable */ //示意操作数不用 #define IS_CV (1<<4) /* Compiled variable */ //PHP剧本变量,即剧本里经过$var_name界说的变量,这些变量是编译阶段确定的,以是是compile variable //result_type除了了下面几品种型外另有一品种型EXT_TYPE_UNUSED (1<<5),前往值不应用时会用到, //这个跟IS_UNUSED的区分是:IS_UNUSED示意本操作前往值不意思(也可简略的以为不前往值), //而EXT_TYPE_UNUSED的含意是有前往值,然而不用到,比方函数前往值不接纳
更多PHP相干常识,请拜访PHP中文网!
以上就是opcode 操作数 5 种没有同的类型的具体内容,更多请存眷资源魔其它相干文章!
标签: php开发教程 php开发资料 php开发自学 opcode
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
抱歉,评论功能暂时关闭!