扩展中如何优雅的输出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); 

}
上一篇下一篇

猜你喜欢

热点阅读