var_dump(object)的返回值为:object()#1
我真的想知道object()#1,object()#2和object()#3之间有什么区别。
非常感谢您的帮助。
var_dump(object)的返回值为:object()#1
我真的想知道object()#1,object()#2和object()#3之间有什么区别。
非常感谢您的帮助。
对于具有相同信息(相同类、相同属性)的对象,它允许确定它们是否是同一实例。例如:
$a = new DateTime();
$b = $a; // Link to same instance
$c = clone $a; // Create a new copy
var_dump($a, $b, $c);
object(DateTime)#1 (3) {
["date"]=>
string(26) "2020-08-15 19:23:39.016441"
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "Europe/Amsterdam"
}
object(DateTime)#1 (3) {
["date"]=>
string(26) "2020-08-15 19:23:39.016441"
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "Europe/Amsterdam"
}
object(DateTime)#2 (3) {
["date"]=>
string(26) "2020-08-15 19:23:39.016441"
["timezone_type"]=>
int(3)
["timezone"]=>
string(16) "Europe/Amsterdam"
}
简单来说:
第一个被声明的对象
如果脚本中有一个对象被重新初始化(重新赋值),那么行为会稍有不同。
例子:
class MyClass
{
}
$obj1 = new MyClass;
$obj2 = new stdClass;
$obj3 = new MyClass;
$obj3 = (object) [];
var_dump($obj3);
var_dump($obj1);
var_dump($obj4);
var_dump($obj2);
结果:
object(MyClass)#3 (0) {
}
object(MyClass)#1 (0) {
}
object(stdClass)#4 (0) {
}
object(stdClass)#2 (0) {
}
var_dump
的顺序如何,#number
都会告诉实例化对象的顺序。var_dump
函数可以输出变量的信息。该函数展示了一个或多个表达式的类型和值等结构化信息。数组和对象会被递归地探索,其值按缩进显示结构。
object()#1
、object()#2
和object()#3
是嵌套对象中不同的对象值,它们已经被var_dump
评估并赋予了一个ID。
点击此处阅读更多信息https://www.php.net/manual/en/function.var-dump.php
编辑 2
似乎Object()#number
是在嵌套对象中找到某个键/值对的顺序。如果一个对象不包含任何键/值对,只包含另一个对象(有键/值对),那么内部对象首先被评估,并相应地给出编号。外部对象最后被评估。
此外,Object()#number
在评估不同的对象时会保持不变。 Object()#number
从第一个对象结束的位置开始。
这里有一个例子。这段代码将解码JSON并转储对象的输出
<?php
$a= '{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}';
$b ='{
"entry1": {
"entry2": {
"title": 2,
"entry3": {
"title": 4,
"title" : 5
}
}
}
}';
$json1 = json_decode($a);
$json2 = json_decode($b);
var_dump($json1);
var_dump($json2);
输出
object(stdClass)#6 (1) {
["glossary"]=>
object(stdClass)#1 (2) {
["title"]=>
string(16) "example glossary"
["GlossDiv"]=>
object(stdClass)#2 (2) {
["title"]=>
string(1) "S"
["GlossList"]=>
object(stdClass)#5 (1) {
["GlossEntry"]=>
object(stdClass)#3 (7) {
["ID"]=>
string(4) "SGML"
["SortAs"]=>
string(4) "SGML"
["GlossTerm"]=>
string(36) "Standard Generalized Markup Language"
["Acronym"]=>
string(4) "SGML"
["Abbrev"]=>
string(13) "ISO 8879:1986"
["GlossDef"]=>
object(stdClass)#4 (2) {
["para"]=>
string(72) "A meta-markup language, used to create markup languages such as DocBook."
["GlossSeeAlso"]=>
array(2) {
[0]=>
string(3) "GML"
[1]=>
string(3) "XML"
}
}
["GlossSee"]=>
string(6) "markup"
}
}
}
}
}
object(stdClass)#10 (1) {
["entry1"]=>
object(stdClass)#9 (1) {
["entry2"]=>
object(stdClass)#7 (2) {
["title"]=>
int(2)
["entry3"]=>
object(stdClass)#8 (1) {
["title"]=>
int(5)
}
}
}
}
如果我错了,请纠正我。
var_dump
在分配这些数字,它们是在对象创建时分配的内部标识符。 - IMSoP从用户的角度来看,数字是一个任意的标识符,可以用于查看两个变量是否指向同一对象;它在程序中是唯一的,不管类和作用域如何。
可以直接使用{{link1:spl_object_id
函数}}检索它。例如:
class Test {}
$test1 = new Test;
$test1_id = spl_object_id( $test1 );
$test2 = new Test;
$test2_id = spl_object_id( $test2 );
var_dump( $test1 );
var_dump( $test2 );
var_dump( $test1_id );
var_dump( $test2_id );
将输出类似于这样的内容:
object(Test)#1 (0) {
}
object(Test)#2 (0) {
}
int(1)
int(2)
实际数字不应被视为具有任何含义,但在实践中,每个创建的对象都被分配一个顺序ID,在每次执行(HTTP请求或脚本调用)开始时重置。
为了给出一个非常快速的技术解释,在var_dump
的定义内部,这是产生输出的行:
php_printf("%sobject(%s)#%d (%d) {\n", COMMON, ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0);
Z_OBJ_HANDLE_P(struc)
宏大致扩展为(*struc).value.obj->handle
- 它从表示对象的C结构中查找handle
成员。这是在一个名为zend_objects_store_put
的函数中初始化的,该函数有以下行:
handle = EG(objects_store).top++;
EG
代表“执行全局”,因此最终意思是“在每个执行存储中递增计数器,并将其用作新对象的handle
”。
这就是为什么我的上面的示例,在没有任何其他代码的情况下运行,将给出ID为1和2:即在该执行期间添加到存储中的前两个项目。