为什么在assertEquals()中stdClass和匿名类的行为不同?

时间:2019-06-09 16:13:28

标签: php unit-testing phpunit

在phpunit中

$this->assertEquals((object)[], (object)[]); 
//and
$this->assertEquals(new stdClass(), new stdClass());

可以,但是

$this->assertEquals(new class{}, new class{});

失败。 为什么?

1 个答案:

答案 0 :(得分:3)

因为它们是两个不同的类。每条new class{}指令都会生成一个单独的类定义。

$one = new class{};
$two = new class{};
var_dump(get_class($one), get_class($two));

输出:

string(39) "class@anonymous/in/FULlj0x7fc9081ac018"
string(39) "class@anonymous/in/FULlj0x7fc9081ac02c"

只有在您的代码中由同一指令创建的匿名类的实例才会共享该类:

function createClass() {
  return new class{};
}
$one = createClass();
$two = createClass();
var_dump(get_class($one), get_class($two));

输出:

string(39) "class@anonymous/in/sbApQ0x7f3138fe3089" 
string(39) "class@anonymous/in/sbApQ0x7f3138fe3089"