40. الواجهات وتعدد الأشكال
توفر الواجهات طريقة قوية أخرى لفرض الهيكل. إنها تحدد عقدًا: يجب على أي فئة تطبق واجهة أن تطبق جميع الدوال المدرجة في تلك الواجهة.
تعريف واجهة
- يتم تعريفها باستخدام الكلمة المفتاحية
interface. - يجب أن تكون جميع الدوال في الواجهة عامة (
public). - تحتوي الواجهات على تواقيع الدوال فقط، ولا تحتوي على منطق أو خصائص (باستثناء الثوابت).
php
<?php interface PaymentGateway { public function processPayment($amount); public function refundTransaction($id); // لا يسمح بنص للدالة! } ?>تطبيق واجهة
تستخدم الفئة الكلمة المفتاحية implements لتبني واجهة. إذا فشلت في تطبيق جميع الدوال المطلوبة، فإن ذلك يؤدي إلى خطأ فادح.
php
<?php class StripeGateway implements PaymentGateway { public function processPayment($amount) { // منطق خاص بـ Stripe... echo "Stripe تعالج $amount من الدولارات."; } public function refundTransaction($id) { // منطق خاص بـ Stripe... echo "Stripe تقوم باسترداد المعاملة $id."; } } class PayPalGateway implements PaymentGateway { public function processPayment($amount) { // منطق خاص بـ PayPal... echo "PayPal تعالج $amount من الدولارات."; } public function refundTransaction($id) { // منطق خاص بـ PayPal... echo "PayPal تقوم باسترداد المعاملة $id."; } } ?>تعدد الأشكال عمليًا
نظرًا لأن كلتا الفئتين تطبقان نفس الواجهة، يمكننا استخدامهما بالتبادل، بالاعتماد على تواقيع الدوال المشتركة (processPayment). هذا هو تعدد الأشكال.
php
<?php function handleTransaction(PaymentGateway $gateway, $amount) { // لا يهمنا ما إذا كانت Stripe أو PayPal، بل فقط أن لديها الدالة. $gateway->processPayment($amount); } handleTransaction(new StripeGateway(), 500); handleTransaction(new PayPalGateway(), 250); ?>