var_dump
结果中,数字#11和(0)代表什么意思:
对象(PDO)#11 (0) { }
我有一个类,并从它创建了一个对象并在多个地方使用。我也不知道,所以让我们一起来查找吧,查看 var_dump
的源代码!(查找 PHP_FUNCTION(var_dump)
)。
(如果太长,可直接跳到结尾)
The PHP function var_dump
is a wrapper for the C function php_var_dump
.
php_var_dump
has a switch()
statement to generate different output for each of PHP's basic types (numbers, strings, booleans, objects, etc), and we're interested in the object
type.
Within the case IS_OBJECT:
case we see this:
php_printf("%sobject(%s)#%d (%d) {\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0);
The #10
in your output comes from the #%d
part of the format-string, which is the 3rd C variadic arg, and the (0)
is the 4th C variadic arg.
Z_OBJ_HANDLE_P(struc)
myht ? zend_array_count(myht) : 0
Z_OBJ_HANDLE_P
basically returns a unique identifier for an object in PHP (so your PDO instance is the 11th object (I think, see below) created in the processing of this request).
The myht
thing is more complicated: but if it's set it means you asked PHP to var_dump
an object
member property (rather than an object itself), e.g. var_dump( $foo->bar )
instead of var_dump( $foo )
. If you aren't referring to an object-property then it just prints 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
相同uint32 handle
成员(但是分别实现)。
_zend_object
与_zend_resource
进行比较,就可以看到这一点zend_list_insert
将其添加到列表中(然后使用ZVAL_NEW_RES
宏)。 ->handle
值是该列表的索引(尽管我不确定它是从0
还是1
或其他基础开始的)。zend_objects_store_put
函数将对象添加到objects_store
列表中,并返回列表中项目的索引(因此在概念上类似于zend_list_insert
)。
0
、1
还是其他值)。object(PDO)#11 (0) { }
表示:
PDO
类的一个实例。
#n
通常指的是资源句柄(套接字或文件指针)。 - marioclass
创建了一个object
。class
就像是对象的蓝图,而object
是类的一个实例,即运行程序中的数据集合(想想USS Enterprise NCC-1701-D是一艘“Galaxy class”星舰:类是“Galaxy”,对象名称是“Enterprise”)。 - Dai#n
是一个对象或资源的“句柄”。在 OP 的情况下,PDO
是一个实际的 PHPclass
中的 PHPobject
,而不是直接作为“resource”(当然,PDO
确实包装了资源)。 - Dai