2012-05-10 7 views
3

저는 OOP에 처음 접했고 기본적인 질문이 있습니다.하지만 간결한 방식으로 설명하는 데 문제가있어 답변을 검색하기가 어렵습니다.기본 PHP 상속

나는 신용 카드 처리를 지원하는 응용 프로그램을 가지고 있으며 다른 공급자 (linkpoint, authorize.net 등)를 추가 할 수 있도록 처리 기능을 추상화하려고합니다. 나는 이런 식으로 뭔가 보이는 간단한 클래스 생성되어 수행 할 작업을 생각 :

class linkpoint extends credit { } 

예를 들어

class credit { 

    function __construct($provider){ 
     // load the credit payment class of $provider 
    } 

} 

가 그럼 난 공급자가 각이 클래스를 확장해야합니다,하지만 난 정말 원하는 신용 클래스를 인터페이스 같은 것, 좀 더 사용하십시오.

$credit = new credit('linkpoint'); 

가 그럼 난 $ 신용이 linkpoint 클래스의 인스턴스가되고 싶어요 : 나는 신용 객체를 싶지 않아, 내가 좋아하는 일을하고 싶습니다. 또는 적어도 모든 메서드에서 링크 포인트 클래스에 정의 된 코드를 실행해야합니다.

어떻게 접근하면 좋을까요? 아니면 더 좋은 방법이 있을까요?

+0

바퀴가 재발합시다! – shadyyx

답변

5

이는 "factory pattern"라고

당신은 당신이 Factory Design Pattern 같은 소리를 설명했다 무엇이

class Credit 
{ 
    public function __construct($factory) 
    { 
    $object = null; 

    switch($factory) { 
     case 'linkpoint': 
     $object = new linkpoint(); 
     break; 
     case 'xy': 
     //... 
    } 
    return $object; 
    } 
} 
+0

이렇게 보입니다. 고맙습니다! 참고 : 아래 Brian은 Credit 클래스 내에서 메소드를 사용해야한다고 언급했습니다. 생성자를 사용하는 대신에 가장 좋은 방법입니까? –

+0

코드를 따라 가면 도움이되지만, 'CreditFactory' 또는 이와 비슷한 이름을 붙이면 코드 자체에 대해 말합니다. 그러나 결국 그것은 전체 프로젝트의 취향과 일관성에 관한 것입니다. 아마도 더 많이 결합되어 있고 객체의 마법 생성이 없기 때문에 아마도 언급 된 의존성 주입을 고수 할 것입니다. 이게 도움이 되길 바란다 :) –

4

나는이 권리를 얻고 있는지 확실하지 않습니다,하지만 당신은 linkpoint의 인스턴스 인 신용을 $ 할 때 당신은 단지 Btw는

$linkPointCredit = new linkpoint(); 

을해야한다. 수업 이름은 항상 대문자로 시작해야합니다.

업데이트 :

이 그럼 당신은 참으로 공장 패턴을 사용할 수 있습니다.

class Credit 
{ 
    private $provider; 

    public function __construct($provider) 
    { 
     if(class_exists($provider) { 
      $this->provider = new $provider(); 
     } 
    } 
} 
+1

하지만 '$ credit'이라고해서는 안되며,'$ linkpointcredit' 또는 좀 더 구체적인 이름으로 지정해야합니다. – wallyk

+0

네, 맞습니다. –

+0

나는 그것을 더 프로그램 적으로 만들 수 있기를 원한다. 예를 들어 데이터베이스에서 사용할 공급자의 매개 변수를로드하는 경우 위에서 설명한대로 $ credit 클래스에 던져 넣을 수 있습니다. 모든 방법은 각 과목마다 동일합니다 (즉, 각 방법은 청구, 환불 등의 방법을가집니다). 일단 앱이 인스턴스화되면 앱 자체는 신용 공급자에게 불가 지합니다. –

1

처럼 처리 할 수 ​​있습니다 (또한 Design patterns 참조). 생성자를 사용하는 대신에 전달 된 문자열에 따라 서브 클래스 중 하나의 인스턴스를 반환하는 클래스 Credit 클래스에 클래스 (정적) 메소드가 있어야합니다.

0

"Dependancy Injection"을 권해드립니다.

class credit { 

    function __construct(Provider $provider) 
    { 
     $this->setProvider($provider); 
    } 

} 

class Provider {} 
class Linkpoint extends Provider {} 
class crossave extends Provider {} 
class Debitcentral extends Provider {} 

그리고 당신이 그들을 좋아 사용할 수 있습니다

$linkpoint = new Linkpoint(); 
$credit = new Credit($linkpoint); 

$crossave = new Crossave(); 
$credit = new Credit($crossave); 

$debitcentral = new Debitcentral(); 
$credit = new Credit($debitcentral); 
// etc...