【问题标题】:What are the numbers in var_dump result?var_dump 结果中的数字是多少?
【发布时间】:2021-06-11 00:51:30
【问题描述】:

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

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

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

【问题讨论】:

  • #n 通常指的是resource handles(套接字或文件指针)
  • “我有一个类,我用它制作了一个对象并在多个地方使用它。” - 我想你的意思是你有一个 object 你是从 class 创建的。 class 就像对象的蓝图,object 是类的实例,即正在运行的程序中的数据集合。 (想想 USS Enterprise NCC-1701-D 是如何成为Galaxy 类 星舰的:类是“Galaxy”,对象名称是“Enterprise”)。
  • @mario 实际上,#n 是对象资源的“句柄”。在 OP 的情况下,PDO 是来自 PHP class 的实际 PHP object,而不是直接作为“资源”(当然,PDO 确实包装了资源)。

标签: php var-dump


【解决方案1】:

我也不知道,一起来了解一下吧,by looking at the source-code for 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 可变参数,(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 还是其他一些基数开始)。
  • 对于 PHP class 对象(“用户类型”等),使用 zend_objects_store_put 函数将对象添加到 objects_store 列表并返回列表中项目的索引(所以它在概念上类似于zend_list_insert)。
    • 同样,我不知道初始值或基值是什么(例如 01 或其他)。

TL;DR:

所以object(PDO)#11 (0) { } 的意思是:

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

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 2019-02-14
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多