2014-12-24 2 views
0

저는 Kent Beck의 Test Driven Development by Example을 통해 작업했으며, PHP 학습 예제를 언어 습득 연습으로 재 작성했습니다.PHP에서 객체 인스턴스와 생성 이해하기

제 2 장에서는 객체를 생성 할 때마다 새로운 객체 (예 : 객체가 달러라고 함)가 반환되도록 클래스 메소드와 단위 테스트를 다시 작성하는 방법을 설명합니다 (이 예에서는 타임스).

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을 반환하는지 알지만 새 Dollar 개체가 올바르게 인스턴스화되고 반환되도록 times 메서드를 다시 작성하는 방법을 모르겠습니다. times 메소드를 다시 작성하려면 어떻게해야합니까? $product이 두 번째로 $five->times(3)으로 전화 할 때 새 개체 인스턴스가 아닌 이유는 무엇입니까?

EDIT - PHP에서 여기에 다시 쓰여진 몇 가지 예제가 있는데,이 상황을 설명하는 어떤 것도 발견하지 못했습니다. (또는 $ 제품에 할당 된 새 오브젝트가없는 이유를 설명했습니다. 그것을).

+0

이되지는 $ 제품 –

+0

감사 @MarkBaker에 대해 - (자바 책에 기록) 원래 시험 2 어설는 같이 쓸 자바에서 $ 오 (가리키는 않는다 : product = 5x (3)), 그래서 나는 $ product 객체 인스턴스와 동일한 작업을 수행했다. 나는 내가 할 수있는 한 밀접하게 따라 갔다. 대신 무엇을 참조해야합니까? –

답변

2

새로운 대상을 반환 중입니다. 그러나 times() 메서드를 호출 할 때마다 현재 객체 amount에 새 값을 할당하고 있습니다. 이 방법을 변경하십시오. 두 번째 어설 $ 5 개의 대하여도 있기 때문에

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

나는 뒤로 물러서서 xdebug를 설정했다면 발견했을 것이다. 고맙습니다. –