转载请注明出处http://blog.csdn.net/fanhengguang_php
PHP内核原理 Zvals类型转换及操作
基本操作
由于zvals是一个复杂的结构体,所以你不能直接对其进行操作如:zv1 + zv2。即使最为简单的操作如+对于zvals来说也是极为复杂的,因为你必须适应不同的类型, 比如:php允许你对double类型与string类型相加(3.14 + ‘17’), 甚至允许你对数组类型进行相加([1, 2, 3] + [4, 5, 6]).
正因如此,php提供了特殊的函数来处理zvals操作, 对于加法操作,是通过add_function
实现的。
zval *a, *b, *result;
MAKE_STD_ZVAL(a);
MAKE_STD_ZVAL(b);
MAKE_STD_ZVAL(result);
ZVAL_DOUBLE(a, 3.14);
ZVAL_STRING(b, "17", 1);
/* result = a + b */
add_function(result, a, b TSRMLS_CC);
php_printf("%Z\n", result); /* 20.14 */
/* zvals a, b, result need to be dtored */
除了add_function()
加法操作函数之外,还有一系列的2元操作(对2个变量进行加减等等)操作:
int add_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* + */
int sub_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* - */
int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* * */
int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* / */
int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* % */
int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* . */
int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* | */
int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* & */
int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* ^ */
int shift_left_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* << */
int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* >> */
int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); /* xor */
int is_equal