php代码嵌入opcode,php代码的opcode

echo 1;        1

function test(){   2

$a="abc"; 3

echo $a; 4

}

test(); 5

多个opcode组成一个op_array, 函数内的opcode与函数外的opcode属于不同的op_array

也就是说 第1行代码 和第2行代码 ,第5行代码  是属于同一个op_array

第3行代码 ,第4行代码 属于另一个op_array

//echo 1;

zend_op_array op_array = emalloc(sizeof(zend_op_array));

op_array->opcodes = emalloc(64*sizeof(zend_op)); //默认64个zend_op INITIAL_OP_ARRAY_SIZE

CG(active_op_array) =op_array;

op_array->type =ZEND_EVAL_CODE;

zend_op*opline= CG(active_op_array)->opcodes+CG(active_op_array)->last++;

opline->opcode=ZEND_ECHO;

opline->op1=1;

opline->op1_type=IS_CONST;

//function test()

zend_op *opline= CG(active_op_array)->opcodes+op_array->last++;

zend_op opline= CG(active_op_array)->opcodes+CG(active_op_array)->last++;

opline->opcode=ZEND_DECLARE_FUNCTION;

opline->op1_type=CONST;

opline->op1=op_array->function_name;

opline->op2=null;//保留之前的op_array

tmp =CG(active_op_array);

zend_op_array op_array= emalloc(sizeof(zend_op_array));

op_array->opcodes = emalloc(64*sizeof(zend_op)); //默认64个zend_op INITIAL_OP_ARRAY_SIZE

op_array->type =ZEND_USER_FUNCTIOIN

op_array->function_name =strtolower(function_name)

CG(function_table)[hash(op_array->function_name)] =op_array;

CG(active_op_array)=op_array;

zend_op*opline= CG(active_op_array)->opcodes+CG(active_op_array)->last++;

opline->opcode=ZEND_ASSIGN;

opline->op1="a";

opline->op1_type=IS_CV;

opline->op2="abc"opline->op2_type=IS_CONST;

pass_two(CG(active_op_array) TSRMLS_CC);//设置handler

CG(active_op_array) = function_token->u.op_array

//test();

zend_op *opline =CG(active_op_array)->opcodes+CG(active_op_array)->last_count++;

opline->opcode=ZEND_DO_FCALL;

opline->op1=function_name;

opline->op1_type=IS_CONST;

最后再执行pass_two(CG(active_op_array) TSRMLS_CC);

设置下面三个的handler

echo1;

function test()

test();

那么执行的时候,EG(active_op_array)=CG(active_op_array)

遍历其内部的opcodes,挨个执行

先执行 echo  1;

再执行 test(); 从EG(function_table)找到相应的op_array,再遍历其内部的opcode,再逐个执行

在执行ZEND_DECLARE_FUNCTION的时候,如果重复,会报错,编译期间不会报错

函数编译这块见 这里

java 的字节码 和php的opcode 完全不一样 见这里, php的opcode 还是C语言代码 ,而java的字节码是二进制的,只不过不能被OS执行执行,需要专门的虚拟机

echo 的 实现 这里 使用了fwrite(str,1,str_len,stderr);

stderr没有缓冲, stdout 有缓冲 (stdin也有),当遇到\n才输出

http://www.php-internals.com/book/?p=chapt03/03-06-02-var-scope

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值