var_dump(object)的结果是什么意思?

4

var_dump(object)的返回值为:object()#1
我真的想知道object()#1,object()#2和object()#3之间有什么区别。
非常感谢您的帮助。


我有这个示例(https://sandbox.onlinephpfunctions.com/code/03ba0319017747f079ad494ff81d1239cc740bc2),我认为它类似于每个对象的“ID”,因为我没有看到它的重复。 - GNassro
4个回答

6

对于具有相同信息(相同类、相同属性)的对象,它允许确定它们是否是同一实例。例如:

$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"
}

2

简单来说:

  • #1 表示 第一个被声明的对象
  • #2:表示第二个被声明的对象
  • #3:以此类推

如果脚本中有一个对象被重新初始化(重新赋值),那么行为会稍有不同。

例子:

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都会告诉实例化对象的顺序。

声明在哪里?你能详细解释一下吗?如果有参考资料,我将不胜感激。 - GNassro
是的,我已经添加了一个示例来解释我想说的话。 - Prince Dorcis

1

var_dump函数可以输出变量的信息。该函数展示了一个或多个表达式的类型和值等结构化信息。数组和对象会被递归地探索,其值按缩进显示结构。

object()#1object()#2object()#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)
      }
    }
  }
}

如果我错了,请纠正我。


1
“System doesn't let me submit” 的意思是 Stack Overflow 不允许他提交问题,因为他的问题字符数没有达到要求。 - GNassro
@ToffeeConmigo,我已经更新了示例。请告诉我它是否回答了你的问题。 - Chilarai
1
就我所看到的,$json1和$json2是两个独立的对象,但是$json2从$json1的末尾(#6)开始(#7)。嗯,很有趣。 - GNassro
@Chilarai 谢谢你的示例!我有点明白你的意思了! - Toffee Conmigo
尽管这是一个合理的推测,但实际上并不是var_dump在分配这些数字,它们是在对象创建时分配的内部标识符。 - IMSoP
显示剩余4条评论

0

从用户的角度来看,数字是一个任意的标识符,可以用于查看两个变量是否指向同一对象;它在程序中是唯一的,不管类和作用域如何。

可以直接使用{{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:即在该执行期间添加到存储中的前两个项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接