美文网首页
扩展中如何优雅的输出zval

扩展中如何优雅的输出zval

作者: cc180912 | 来源:发表于2018-12-03 18:01 被阅读0次

    在扩展开发中,我们也会经常使用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); 
    
    }
    

    相关文章

      网友评论

          本文标题:扩展中如何优雅的输出zval

          本文链接:https://www.haomeiwen.com/subject/qfhucqtx.html