【问题标题】:Compare two StdClass objects with PHP用 PHP 比较两个 StdClass 对象
【发布时间】:2021-06-05 05:39:34
【问题描述】:

我有两个对象,它们是相同的,但用不同的方法编写。一种是 JSON(解码):

$object1 = json_decode('{"null":null,"int":1}');

还有一个是 StdClass:

$object2 = (object)[
    "null" => null,
    "int"  => 1,
];

如您所见,它们包含完全相同的结构(键和值)。没有什么不同。所以应该是相等的。但是……不是。

echo json_encode($object1 === $object2);
// -> false

我想也许我错了,JSON 不是 StdClass。所以我使用了var_dump,它们仍然是一样的:

object(stdClass)#1 (2) {
  ["null"]=>
  NULL
  ["int"]=>
  int(1)
}

object(stdClass)#2 (2) {
  ["null"]=>
  NULL
  ["int"]=>
  int(1)
}

现在我很沮丧,我不知道如何比较两个对象,并检测它们之间的变化。

有可能吗?

编辑:

我认为如果我将 $object1JSON 更改为 StdClass 可能会起作用,就像第二个一样:

$object1 = (object)[
    "null" => null,
    "int"  => 1,
];

但仍然...false

【问题讨论】:

标签: php json comparison stdclass


【解决方案1】:

比较对象有两种方法。如果您要比较的对象是同一类的同一实例,则使用 === 运算符将返回 true。即它们是同一个对象。

使用== 运算符如果两个对象的所有属性都相等,并且对象是同一类的实例,则返回 true。

您正在比较两个不同的对象,所以 === 将返回 false,但 == 应该返回 true。

https://3v4l.org/UdFFT

参考:https://www.php.net/manual/en/language.oop5.object-comparison.php

【讨论】:

  • 感谢您的回答。我必须问 - 它们有什么不同?使用== 而不是=== 背后的想法是什么?我认为只有当您使用 === 时,这意味着您希望结果“完全相等”
  • 对象总是通过引用传递。表达式 $obj2 = $obj1 传递对 $obj1 的引用,而不是值。以这种方式使用===== 允许程序员区分两个相同的对象,以及对同一对象的两个引用。
  • 无论如何,这个(OP的代码)永远不会工作echo json_encode($object1 == $object2);
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2023-03-26
  • 2019-08-02
  • 2014-01-26
  • 2014-03-02
相关资源
最近更新 更多