首页 > 解决方案 > var_dump 结果中的数字是多少?

问题描述

这个var_dump结果中的数字 #11 和 (0) 是什么意思:

对象(PDO)#11 (0) { }

我有一个类,我用它制作了一个对象并在多个地方使用它。

标签: phpvar-dump

解决方案


我也不知道,让我们一起来看看源代码var_dump吧!(寻找PHP_FUNCTION(var_dump))。

(对于 TL;DR,跳到最后)

  1. PHP 函数var_dump是 C 函数的包装器php_var_dump

  2. php_var_dump有一条switch()语句为 PHP 的每种基本类型(数字、字符串、布尔值、对象等)生成不同的输出,我们对object类型感兴趣。

  3. 在这种case IS_OBJECT:情况下,我们看到:

    php_printf("%sobject(%s)#%d (%d) {\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0);
    
  4. 输出中的#10来自#%d格式字符串的一部分,即第三个 C 可变参数 arg,而(0)是第四个 C 可变参数。

    • 第三个是Z_OBJ_HANDLE_P(struc)
    • 第四个是myht ? zend_array_count(myht) : 0
  5. Z_OBJ_HANDLE_P基本上返回 PHP 中对象的唯一标识符(因此您的 PDO 实例是在处理此请求时创建的第 11 个对象(我认为,见下文) )。

  6. myht事情更复杂:但如果它被设置,则意味着您要求 PHP 访问成员属性(而var_dump不是object对象本身),例如,var_dump( $foo->bar )而不是var_dump( $foo ). 如果您不是指对象属性,那么它只会打印0.


关于如何->handle确定值及其含义:

  • Z_OBJ_HANDLE_P宏是 Z_OBJ_HANDLE(*(zval_p))
    • Z_OBJ_HANDLE宏是(Z_OBJ((zval)))->handle
    • Z_OBJ宏是(zval).value.obj
    • 所以Z_OBJ_HANDLE_P(x)是一样的x.value.obj->handle
  • 请注意,用户定义的类和 PHP“资源”的实例都是“对象”,并且都有一个uint32 handle成员(但分别实现)。
    • 如果您_zend_objectzend_types.h_zend_resource中的比较,您可以看到这一点
  • 对于“资源”(PHP 环境提供的内置对象),PHP 在执行环境中维护资源列表。创建新资源时,它被添加到列表中zend_list_insert(然后使用ZVAL_NEW_RES宏)。该->handle值是该列表的索引(尽管我不确定它是否从01其他一些基础开始)。
  • 对于 PHPclass对象(“用户类型”等),zend_objects_store_put使用该函数将对象添加到objects_store列表并返回列表中项目的索引(因此它在概念上类似于zend_list_insert)。
    • 同样,我不知道初始值或基值是什么(例如01或其他)。

TL;博士:

所以object(PDO)#11 (0) { }意味着:

  • 该对象是PDO该类的一个实例。
  • 该对象是在处理当前 HTTP 请求期间创建的第 11 个(可能)对象。
  • 该对象是它自己的顶级对象,而不是对象属性引用。

推荐阅读