var_dump 结果中的数字是多少?

Bas*_*rIT 3 php var-dump

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

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

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

Dai*_*Dai 6

我也不知道,所以让我们一起通过查看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);
    
    Run Code Online (Sandbox Code Playgroud)
  4. #10在输出来自#%d格式字符串,这是第三Ç可变参数arg的一部分,并且(0)是第四Ç可变参数ARG。

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

  6. myht事情更加复杂:但如果它的设置就意味着你问到PHPvar_dumpobject成员属性(而不是对象本身),例如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_object_zend_resourcezend_types.h
  • 对于“资源”(PHP 环境提供的内置对象),PHP 维护一个执行环境中的资源列表。创建新资源时,它会被添加到列表中zend_list_insert(然后使用ZVAL_NEW_RES宏)。该->handle值是该列表中的索引(尽管我不确定它是从01还是其他一些基础开始)。
  • 对于 PHPclass对象(“用户类型”等),使用该zend_objects_store_put函数将对象添加到objects_store列表并返回列表中项目的索引(因此它在概念上类似于zend_list_insert)。
    • 同样,我不知道初始或基础值是什么(例如01或别的东西)。

特尔;博士:

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

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