Menu
Coddy logo textTech

복습 - 결제 처리기

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 37번째.

challenge icon

챌린지

쉬움

다형성에 대해 지금까지 배운 모든 내용을 하나로 결합하는 완전한 결제 처리 시스템을 만들어 봅시다. 서로 다른 결제 수단을 하나의 통합된 processor를 통해 처리할 수 있는 interface 기반 아키텍처를 만들 것입니다. 이를 통해 다형성이 코드를 얼마나 유연하고 확장 가능하게 만드는지 확인할 수 있습니다.

코드를 다섯 개의 파일로 구성합니다.

  • PaymentMethod.php: 두 가지 메서드 시그니처를 가진 PaymentMethod interface를 Define합니다. 결제를 처리하는 process(float $amount): string과 결제 유형 이름을 반환하는 static 메서드 getMethodName(): string입니다. 이 계약을 통해 모든 결제 수단을 일관된 방식으로 처리할 수 있습니다.
  • CreditCard.php: PaymentMethod를 implements하는 CreditCard class를 Create합니다. interface 파일을 Include합니다. 이 class에는 constructor를 통해 설정되는 private $lastFourDigits 속성이 있어야 합니다. process()를 Implement하여 "Processing $[amount] via Credit Card ending in [lastFourDigits]"을 반환하도록 합니다(금액은 소수점 이하 2자리로 Format). late static binding을 사용하여 static getMethodName()을 Implement하고 "Credit Card"를 반환하도록 합니다.
  • PayPal.php: PaymentMethod를 implements하는 PayPal class를 Create합니다. interface 파일을 Include합니다. 이 class에는 constructor를 통해 설정되는 private $email 속성이 있어야 합니다. process()를 Implement하여 "Processing $[amount] via PayPal account [email]"을 반환하도록 합니다(금액은 소수점 이하 2자리로 Format). static getMethodName()을 Implement하여 "PayPal"을 반환하도록 합니다.
  • PaymentProcessor.php: 결제를 조정하는 PaymentProcessor class를 Create합니다. interface 파일을 Include합니다. 모든 결제 수단을 accept할 수 있도록 interface type hinting을 사용하는 executePayment(PaymentMethod $method, float $amount): string 메서드를 Add합니다. 이 메서드는 결제 수단에서 process()를 calling한 결과를 반환해야 합니다. 전달된 결제 수단의 class에서 static getMethodName()을 사용하여 "Payment via: [methodName]"을 반환하는 describeMethod(PaymentMethod $method): string 메서드도 Add합니다.
  • main.php: 모든 결제 class 파일과 processor를 Include합니다. PaymentProcessor instance를 Create합니다. 세 가지 inputs를 받습니다. 신용 카드의 last four digits, PayPal email 주소, 그리고 결제 amount입니다. 각각의 식별자를 사용하여 CreditCardPayPal instance를 모두 Create합니다. amount를 float로 변환합니다. processor를 사용하여 먼저 신용 카드로 결제를 Execute한 다음 PayPal로 결제를 Execute합니다. 각 결과를 한 줄에 하나씩 Print합니다. 마지막으로 PayPal 결제 수단에 대한 메서드 설명을 Print합니다.

이 설계의 장점은 PaymentProcessor가 신용 카드나 PayPal에 대해 구체적으로 아무것도 알 필요가 없다는 것입니다. PaymentMethod interface만 알고 있으면 됩니다. 내일 BankTransfer 또는 Cryptocurrency class를 Add하더라도 processor는 아무런 수정 없이 이를 처리할 수 있습니다. 이것이 interface 기반 다형성과 late static binding이 결합된 강력한 기능입니다!

직접 해보기

<?php
// 필요한 모든 파일 포함
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

// 입력 읽기
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));

// TODO: PaymentProcessor 인스턴스 생성

// TODO: 마지막 네 자리 숫자로 CreditCard 인스턴스 생성

// TODO: 이메일로 PayPal 인스턴스 생성

// TODO: 신용카드로 결제를 실행하고 결과 출력

// TODO: PayPal로 결제를 실행하고 결과 출력

// TODO: PayPal 결제 방법의 메서드 설명 출력
?>

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러