1

我正在自学 PHP 和 TDD(使用 PHP 和 PHPUnit)。我正在阅读Kent Beck的《示例测试驱动开发》一书。

例如,在第 3 章中,他为平等检验提出了以下建议:

public void testEquality() {
    assertTrue(new Dollar(5).equals(new Dollar(5)));
}

在 Dollar 类中,他重写了 equals 方法:

public boolean equals(Object object) {
   Dollar dollar = (Dollar) object;
   return amount == dollar.amount;
}

我是 PHP 新手,这可能无济于事,但我不确定如何将其翻译成 PHP。

对于我尝试的第一个功能:

public function testEquality(){
    $a = new Dollar(5);
    $this->assertTrue($a->equals($b = new Dollar(5)));
}

这是正确的轨道吗?据我所知,现在必须将对象分配给一个变量,对吗?在我探索的那条路线之前

$this->assertTrue(new Dollar(5)->equals(new Dollar(5))); 

抛出语法错误。然而,令人惊讶的是重构了早期的 testMultiplication 方法$this->assertEquals(new Dollar(10), $five->times(2));

equals方法而言,这对我来说完全陌生,我只是不知道从哪里开始。

如何在 PHP 中正确重建上述内容?如果我能做对一些,我想我可以处理其余的例子。

作为一个附带问题,有没有人知道这个 Money 示例是否已经在 PHP 中处理过并且代码在那里?

4

1 回答 1

1

您的代码如下

public boolean equals(Object object) {
   Dollar dollar = (Dollar) object;
   return amount == dollar.amount;
}

这意味着这个(一行一行)

  1. 定义一个调用的新方法equals,该方法将返回trueorfalse并期望一个类型的对象Object(在 Java 中表示每个对象)作为参数
  2. 将类型的对象转换Object为类型Dollar (关于类型转换的wiki),现在您可以使用该对象的公共方法和属性
  3. 将当前上下文中的属性amount与来自dollar(来自object)的属性进行比较

您现在可以将方法逐行转换为 PHP ,而无需进行类型转换

public function equals($object)
{
    return $this->amount == $object->amount;
}

可以使用不同的方法声明:

public function equals(Dollar $object)

这样您就可以确保只比较相同类型的两个对象。

用法也与 Java 类似:

$a = new Dollar(5);
$b = new Dollar(5);
if ($a->equals($b))
    print "TRUE";
else
    print "FALSE";

要了解有关 PHP 中对象比较的更多信息,您最好阅读手册

于 2013-04-28T10:22:02.690 回答