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格式字符串,这是第三Ç可变参数arg的一部分,并且(0)是第四Ç可变参数ARG。- 第三个是
Z_OBJ_HANDLE_P(struc) - 第四个是
myht ? zend_array_count(myht) : 0
- 第三个是
-
Z_OBJ_HANDLE_P基本上为 PHP 中的对象返回一个唯一标识符(因此您的 PDO 实例是在处理此请求时创建的第 11 个对象(我认为,见下文))。 -
该
myht事情更加复杂:但如果它的设置就意味着你问到PHPvar_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_resource在zend_types.h
- 你可以看到这一点,如果你比较
- 对于“资源”(PHP 环境提供的内置对象),PHP 维护一个执行环境中的资源列表。创建新资源时,它会被添加到列表中
zend_list_insert(然后使用ZVAL_NEW_RES宏)。该->handle值是该列表中的索引(尽管我不确定它是从0或1还是其他一些基础开始)。 - 对于 PHP
class对象(“用户类型”等),使用该zend_objects_store_put函数将对象添加到objects_store列表并返回列表中项目的索引(因此它在概念上类似于zend_list_insert)。- 同样,我不知道初始或基础值是什么(例如
0,1或别的东西)。
- 同样,我不知道初始或基础值是什么(例如
特尔;博士:
所以object(PDO)#11 (0) { }意思是:
- 对象是
PDO类的一个实例。 - 该对象是在处理当前 HTTP 请求期间创建的第 11 个(可能)对象。
- 对象是它自己的顶级对象,而不是对象属性引用。