今天无意中看到php底层opcode的代码,有关echo跟print的定义。
zend编译php的print时候:
void zend_do_print(znode *result,const znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->result.op_type = IS_TMP_VAR;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->opcode = ZEND_PRINT;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
*result = opline->result;
}
虽然看不懂这段底层四不像编译的代码,不过貌似那个*result应该是返回值的意思。所以print的时候,应该是有返回值的。
zend编译php的echo时候:
void zend_do_echo(const znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_ECHO;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
}
但是这明显是不会有result作为返回值的。
zend编译php的print时候:
void zend_do_print(znode *result,const znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->result.op_type = IS_TMP_VAR;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->opcode = ZEND_PRINT;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
*result = opline->result;
}
虽然看不懂这段底层四不像编译的代码,不过貌似那个*result应该是返回值的意思。所以print的时候,应该是有返回值的。
zend编译php的echo时候:
void zend_do_echo(const znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_ECHO;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
}
但是这明显是不会有result作为返回值的。
写一个简单的php进行验证一下结果,print的时候,是可以用‘=’来赋值的。但是echos是不能用来‘=’来赋值的。这应该就是有没有返回值的区别吧。
本文深入探讨了PHP底层的print与echo函数的实现细节,揭示了它们在编译阶段的不同处理方式以及如何影响执行流程。通过分析zend编译器的源代码,解释了print与echo在操作符使用、变量处理及返回值等方面的差异。
3930

被折叠的 条评论
为什么被折叠?



