gpt4 book ai didi

php - var_dump 结果中的数字是多少?

转载 作者:行者123 更新时间:2023-12-04 00:51:04 25 4
gpt4 key购买 nike

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

object(PDO)#11 (0) { }

我有一个类,我从它创建了一个对象并在多个地方使用它。

最佳答案

我也不知道,一起来了解一下,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 的基本类型(数字、字符串、 bool 值、对象等)生成不同的输出,并且我们对 object 类型感兴趣。

  3. 案例 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 部分,这是第 3 个 C 可变参数,而 (0) 是第 4 个 C 可变参数。

    • 第三个是Z_OBJ_HANDLE_P(struc)
    • 第 4 个是 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 值是该列表的索引(尽管我不确定它是从 0 还是 1 或其他一些基数开始) .
  • 对于 PHP class 对象(“用户类型”等),使用 zend_objects_store_put 函数将对象添加到 objects_store 列表并返回列表中项目的索引(因此它在概念上类似于 zend_list_insert)。
    • 同样,我不知道初始值或基值是什么(例如 01 或其他)。

长话短说:

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

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

关于php - var_dump 结果中的数字是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66609467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com