【问题标题】:Understanding Object Instances and Creation in PHP了解 PHP 中的对象实例和创建
【发布时间】:2015-02-22 18:49:33
【问题描述】:

我一直在研究 Kent Beck 的测试驱动开发示例,并用 PHP 重写示例作为学习语言的练习。

第 2 章,“Degenerate Objects”,描述了重写类方法和单元测试以确保每次调用方法时(在示例中,它被称为 times)都返回一个新对象(在示例中,该对象称为 Dollar) )。

到目前为止,我的班级是这样的:

class Dollar {

public $amount;

public function __construct($amount) {
    $this->amount = $amount;
}

public function times($multiplier) {
    return new Dollar($this->amount *= $multiplier);
}
}

我的测试是这样的:

 public function testTimes()
{
    $five = new Dollar(5);
    $product =  $five->times(2);

    $this->assertEquals(10, $product->amount);

    $product = $five->times(3);
    $this->assertEquals(15, $product->amount);
}

第一个断言通过。 第二个断言失败,返回 30

从概念上讲,我知道它为什么返回 30,但我不确定如何重写 times 方法以确保正确实例化并返回新的 Dollar 对象。如何重写 times 方法?为什么我第二次调用$five->times(3)$product不是一个新的对象实例?

编辑 - 我在 SO 上找到了一些用 PHP 重写的书的例子,但我没有遇到任何描述这种情况的例子(或者对我来说澄清了为什么 $product 没有分配新对象它)。

【问题讨论】:

  • 因为你的第二个断言也是针对 $5,而不是针对 $product
  • 感谢@MarkBaker - 原始测试(用 Java 写在书中)做了第二个断言指向 $5(在 Java 中它写为: product = Five.times(3) ),所以我对 $product 对象实例做了同样的事情。我尽可能地紧跟在后面。它应该引用什么?

标签: php unit-testing oop phpunit


【解决方案1】:

它正在返回新对象。但是,当您每次调用 times() 方法时,您当前正在为原始对象 amount 属性分配新值。把方法改成这个。

public function times($multiplier) {
    return new Dollar($this->amount * $multiplier);
}

【讨论】:

  • 如果我退后一步并着手设置 xdebug,我会发现的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2021-07-22
  • 1970-01-01
  • 2016-05-23
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多