今天无意中看到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是不能用来‘=’来赋值的。这应该就是有没有返回值的区别吧。