将var_dump内容保存到文件或者变量中
发布日期:2021-08-26 18:51:13 浏览次数:5 分类:技术文章

本文共 3487 字,大约阅读时间需要 11 分钟。

hot3.png

我们知道,在调试代码时使用var_dump可以显示出众多需要的信息,像数据类型等。

同时,我们有时候也需要将var_dump的结果保存,比如说存进日志,亦或是传给变量后留作他用。

直接将var_dump的结果记录是不可以的,如下方式才是正道

ob_start();  var_dump($_SERVER);  $result = ob_get_clean();

翻一翻底层代码如下:

PHPAPI void php_var_dump(zval *struc, int level) /* {
{
{ */{ HashTable *myht; zend_string *class_name; int is_temp; int is_ref = 0; zend_ulong num; zend_string *key; zval *val; uint32_t count; if (level > 1) { php_printf("%*c", level - 1, ' '); }again: switch (Z_TYPE_P(struc)) { case IS_FALSE: php_printf("%sbool(false)\n", COMMON); break; case IS_TRUE: php_printf("%sbool(true)\n", COMMON); break; case IS_NULL: php_printf("%sNULL\n", COMMON); break; case IS_LONG: php_printf("%sint(" ZEND_LONG_FMT ")\n", COMMON, Z_LVAL_P(struc)); break; case IS_DOUBLE: php_printf("%sfloat(%.*G)\n", COMMON, (int) EG(precision), Z_DVAL_P(struc)); break; case IS_STRING: php_printf("%sstring(%zd) \"", COMMON, Z_STRLEN_P(struc)); PHPWRITE(Z_STRVAL_P(struc), Z_STRLEN_P(struc)); PUTS("\"\n"); break; case IS_ARRAY: myht = Z_ARRVAL_P(struc); if (level > 1 && ZEND_HASH_APPLY_PROTECTION(myht) && ++myht->u.v.nApplyCount > 1) { PUTS("*RECURSION*\n"); --myht->u.v.nApplyCount; return; } count = zend_array_count(myht); php_printf("%sarray(%d) {\n", COMMON, count); is_temp = 0; ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) { php_array_element_dump(val, num, key, level); } ZEND_HASH_FOREACH_END(); if (level > 1 && ZEND_HASH_APPLY_PROTECTION(myht)) { --myht->u.v.nApplyCount; } if (is_temp) { zend_hash_destroy(myht); efree(myht); } if (level > 1) { php_printf("%*c", level-1, ' '); } PUTS("}\n"); break; case IS_OBJECT: if (Z_OBJ_APPLY_COUNT_P(struc) > 0) { PUTS("*RECURSION*\n"); return; } Z_OBJ_INC_APPLY_COUNT_P(struc); myht = Z_OBJDEBUG_P(struc, is_temp); class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc)); php_printf("%sobject(%s)#%d (%d) {\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0); zend_string_release(class_name); if (myht) { zend_ulong num; zend_string *key; zval *val; ZEND_HASH_FOREACH_KEY_VAL_IND(myht, num, key, val) { php_object_property_dump(val, num, key, level); } ZEND_HASH_FOREACH_END(); if (is_temp) { zend_hash_destroy(myht); efree(myht); } } if (level > 1) { php_printf("%*c", level-1, ' '); } PUTS("}\n"); Z_OBJ_DEC_APPLY_COUNT_P(struc); break; case IS_RESOURCE: { const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc)); php_printf("%sresource(%d) of type (%s)\n", COMMON, Z_RES_P(struc)->handle, type_name ? type_name : "Unknown"); break; } case IS_REFERENCE: //??? hide references with refcount==1 (for compatibility) if (Z_REFCOUNT_P(struc) > 1) { is_ref = 1; } struc = Z_REFVAL_P(struc); goto again; break; default: php_printf("%sUNKNOWN:0\n", COMMON); break; }}/* }}} *//* {
{
{ proto void var_dump(mixed var) Dumps a string representation of variable to output */PHP_FUNCTION(var_dump){ zval *args; int argc; int i; ZEND_PARSE_PARAMETERS_START(1, -1) Z_PARAM_VARIADIC('+', args, argc) ZEND_PARSE_PARAMETERS_END(); /*这里进行了循环调用,结果是输出到终端*/ for (i = 0; i < argc; i++) { php_var_dump(&args[i], 1); }}/* }}} */

PHP_FUNCTION(var_dump) 在循环中调用 PHPAPI void php_var_dump(zval *struc, int level),每次循环将结果输出到终端,这就是为什么直接使用赋值或者写入文件中会不成功,只能通过ob_start实现

转载于:https://my.oschina.net/xtfjt1988/blog/832508

转载地址:https://blog.csdn.net/weixin_33894992/article/details/92431672 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:#新技能# ps 简单抠图【持续更新】
下一篇:使用JavaScript调用ActiveX控

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年01月18日 20时52分04秒