php - var_dump 结果中的数字是多少?
问题描述
这个var_dump
结果中的数字 #11 和 (0) 是什么意思:
对象(PDO)#11 (0) { }
我有一个类,我用它制作了一个对象并在多个地方使用它。
解决方案
我也不知道,让我们一起来看看源代码var_dump
吧!(寻找PHP_FUNCTION(var_dump)
)。
(对于 TL;DR,跳到最后)
PHP 函数
var_dump
是 C 函数的包装器php_var_dump
。php_var_dump
有一条switch()
语句为 PHP 的每种基本类型(数字、字符串、布尔值、对象等)生成不同的输出,我们对object
类型感兴趣。在这种
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);
输出中的
#10
来自#%d
格式字符串的一部分,即第三个 C 可变参数 arg,而(0)
是第四个 C 可变参数。- 第三个是
Z_OBJ_HANDLE_P(struc)
- 第四个是
myht ? zend_array_count(myht) : 0
- 第三个是
Z_OBJ_HANDLE_P
基本上返回 PHP 中对象的唯一标识符(因此您的 PDO 实例是在处理此请求时创建的第 11 个对象(我认为,见下文) )。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_object
与zend_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
)。- 同样,我不知道初始值或基值是什么(例如
0
、1
或其他)。
- 同样,我不知道初始值或基值是什么(例如
TL;博士:
所以object(PDO)#11 (0) { }
意味着:
- 该对象是
PDO
该类的一个实例。 - 该对象是在处理当前 HTTP 请求期间创建的第 11 个(可能)对象。
- 该对象是它自己的顶级对象,而不是对象属性引用。
推荐阅读
- react-native - React-Native:应用程序在启动时崩溃
- ruby - 如何在 Ruby 应用程序中的 iframe 上加载过期网址
- r - 时间序列数据上的第二个 geom_bar / geom_line
- unity3d - Unity3D 虚拟网络摄像头插件,将统一视口内容流式传输到其他应用程序作为 Mac OS 的虚拟摄像头
- android - 剥离Android中共享库的节头
- javascript - 如何在 NVD3.js 中获取轴的更新和渲染值
- azure - 使用 Graph API (Azure AD B2C) 更改密码
- javascript - 有没有可能访问添加到 firestore 数据库的最新文档的方法?
- python - 在不读取文件的情况下使用 parquet 文件统计信息
- selenium-webdriver - 使用 Selenium 在 HTML5 上拖放