Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ملخص - معالج الدفع (Payment Processor)

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 37 من 91.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا كاملًا لمعالجة المدفوعات يجمع كل ما تعلمته عن تعدد الأشكال. ستنشئ بنية تعتمد على interface، حيث يمكن معالجة طرق الدفع المختلفة من خلال معالج موحّد واحد: موضحًا كيف يجعل تعدد الأشكال الشيفرة مرنة وقابلة للتوسّع.

ستنظّم شيفرتك عبر خمسة ملفات:

  • PaymentMethod.php: عرّف interface باسم PaymentMethod يتضمن توقيعَي method: process(float $amount): string لمعالجة الدفع، وmethod static باسم getMethodName(): string يعيد اسم نوع الدفع. يضمن هذا العقد إمكانية معالجة أي طريقة دفع بشكل موحّد.
  • CreditCard.php: أنشئ class باسم CreditCard يطبّق PaymentMethod. Include ملف interface. يجب أن يحتوي class على property خاصة $lastFourDigits يتم تعيينها من خلال constructor. نفّذ process() لإعادة "Processing $[amount] via Credit Card ending in [lastFourDigits]" (نسّق amount إلى منزلتين عشريتين). نفّذ static getMethodName() باستخدام late static binding لإعادة "Credit Card".
  • PayPal.php: أنشئ class باسم PayPal يطبّق PaymentMethod. Include ملف interface. يجب أن يحتوي class على property خاصة $email يتم تعيينها من خلال constructor. نفّذ process() لإعادة "Processing $[amount] via PayPal account [email]" (نسّق amount إلى منزلتين عشريتين). نفّذ static getMethodName() لإعادة "PayPal".
  • PaymentProcessor.php: أنشئ class باسم PaymentProcessor يتولى تنسيق المدفوعات. Include ملف interface. أضف method باسم executePayment(PaymentMethod $method, float $amount): string يستخدم interface type hinting لقبول أي طريقة دفع. يجب أن يعيد هذا method نتيجة استدعاء process() على طريقة الدفع. أضف method آخر باسم describeMethod(PaymentMethod $method): string يعيد "Payment via: [methodName]" باستخدام static getMethodName() من class الخاص بطريقة الدفع المُمرَّرة.
  • main.php: Include جميع ملفات class الخاصة بالدفع وملف المعالج. أنشئ instance من PaymentProcessor. ستتلقى ثلاث قيم إدخال: آخر أربعة أرقام من card ائتمانية، وعنوان email في PayPal، ومقدار الدفع. أنشئ instance من كلٍّ من CreditCard وPayPal باستخدام المعرّفات الخاصة بهما. حوّل amount إلى float. استخدم المعالج لتنفيذ عملية دفع باستخدام card أولًا، ثم باستخدام PayPal. اطبع كل نتيجة في سطر مستقل. وأخيرًا، اطبع وصف method الخاص بطريقة دفع PayPal.

يكمن جمال هذا التصميم في أن PaymentProcessor لا يعرف شيئًا عن credit cards أو PayPal على وجه التحديد. إنه يعرف فقط interface PaymentMethod. يمكنك إضافة class باسم BankTransfer أو Cryptocurrency غدًا، وسيتولى المعالج التعامل معهما دون أي تعديلات. تلك هي قوة تعدد الأشكال المعتمد على 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 عبر الإنترنت