扩展中如何优雅的输出zval
2018-12-03 本文已影响0人
cc180912
在扩展开发中,我们也会经常使用zval hashtable 这种php提供的数据结构,因为真的很方便,有这两个数据结构感觉写扩展就和php代码效率差不多了。但是使用后如果debug的时候想要打印出来这zval中的值确是挺麻烦的,如果能像php中print_r一样输出zval的值呢
在php的源码zend.c中提供了两个输出zval值的函数,非常好用,和print_r效果类似
ZEND_API zend_string *zend_print_zval_r_to_str(zval *expr, int indent)
{
smart_str buf = {0};
zend_print_zval_r_to_buf(&buf, expr, indent);
smart_str_0(&buf);
return buf.s;
}
ZEND_API void zend_print_zval_r(zval *expr, int indent)
{
zend_string *str = zend_print_zval_r_to_str(expr, indent);
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
zend_string_release(str);
}
代码很简单,一个是直接输出到STDOUT, 一个是返回zend_string字符串
使用demo
//输出hashtable
void display_hash_table(HashTable *ht) {
zval temp;
Z_TYPE_INFO(temp) = IS_ARRAY;
Z_ARR(temp) = ht;
zend_print_zval_r(&temp, 1);
}