Menu
CoddyTech

Ôn tập: bộ xử lý thanh toán

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 37 trên 91.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống xử lý thanh toán hoàn chỉnh, kết hợp mọi điều bạn đã học về tính đa hình. Bạn sẽ tạo một kiến trúc dựa trên interface, trong đó có thể xử lý nhiều phương thức thanh toán khác nhau thông qua một bộ xử lý thống nhất, qua đó cho thấy tính đa hình giúp code linh hoạt và dễ mở rộng như thế nào.

Bạn sẽ sắp xếp code trong năm tệp:

  • PaymentMethod.php: Định nghĩa interface PaymentMethod với hai chữ ký phương thức: process(float $amount): string để xử lý thanh toán và phương thức tĩnh getMethodName(): string trả về tên loại thanh toán. Giao kèo này đảm bảo có thể xử lý đồng nhất mọi phương thức thanh toán.
  • CreditCard.php: Tạo lớp CreditCard triển khai PaymentMethod. Đưa tệp interface vào. Lớp này cần có thuộc tính riêng tư $lastFourDigits, được thiết lập thông qua hàm khởi tạo. Triển khai process() để trả về "Processing $[amount] via Credit Card ending in [lastFourDigits]" (định dạng số tiền với 2 chữ số thập phân). Triển khai phương thức tĩnh getMethodName() bằng late static binding để trả về "Credit Card".
  • PayPal.php: Tạo lớp PayPal triển khai PaymentMethod. Đưa tệp interface vào. Lớp này cần có thuộc tính riêng tư $email, được thiết lập thông qua hàm khởi tạo. Triển khai process() để trả về "Processing $[amount] via PayPal account [email]" (định dạng số tiền với 2 chữ số thập phân). Triển khai phương thức tĩnh getMethodName() để trả về "PayPal".
  • PaymentProcessor.php: Tạo lớp PaymentProcessor để điều phối các khoản thanh toán. Đưa tệp interface vào. Thêm phương thức executePayment(PaymentMethod $method, float $amount): string, sử dụng gợi ý kiểu interface để nhận bất kỳ phương thức thanh toán nào. Phương thức này cần trả về kết quả khi gọi process() trên phương thức thanh toán. Thêm phương thức describeMethod(PaymentMethod $method): string để trả về "Payment via: [methodName]", sử dụng phương thức tĩnh getMethodName() từ lớp của phương thức thanh toán được truyền vào.
  • main.php: Đưa tất cả các tệp lớp thanh toán và bộ xử lý vào. Tạo một instance PaymentProcessor. Bạn sẽ nhận ba đầu vào: bốn chữ số cuối của thẻ tín dụng, địa chỉ email PayPal và số tiền thanh toán. Tạo một instance CreditCard và một instance PayPal với các thông tin định danh tương ứng. Chuyển số tiền thành số thực. Dùng bộ xử lý để thực hiện thanh toán bằng thẻ tín dụng trước, sau đó bằng PayPal. In mỗi kết quả trên một dòng riêng. Cuối cùng, in phần mô tả phương thức thanh toán PayPal.

Điểm hay của thiết kế này là PaymentProcessor không cần biết cụ thể về thẻ tín dụng hay PayPal. Nó chỉ cần biết về interface PaymentMethod. Ngày mai, bạn có thể thêm lớp BankTransfer hoặc Cryptocurrency, và bộ xử lý sẽ xử lý chúng mà không cần chỉnh sửa gì. Đó là sức mạnh của tính đa hình dựa trên interface kết hợp với late static binding!

Tự làm thử

<?php
// Thêm tất cả tệp cần thiết
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

// Đọc các giá trị đầu vào
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));

// TODO: Tạo một instance của PaymentProcessor

// TODO: Tạo một instance của CreditCard với bốn chữ số cuối

// TODO: Tạo một instance của PayPal với địa chỉ email

// TODO: Thực hiện thanh toán bằng thẻ tín dụng và in ra kết quả

// TODO: Thực hiện thanh toán bằng PayPal và in ra kết quả

// TODO: In ra mô tả phương thức của phương thức thanh toán PayPal
?>

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online