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

حل تعارض السمات

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

عندما تعرّف سمتان methods بالاسم نفسه، يطرح PHP خطأً فادحًا. يجب أن تخبر PHP صراحةً بكيفية التعامل مع conflict هذا باستخدام العاملين insteadof وas.

<?php
trait FileLogger {
    public function log(string $message): void {
        echo "File: $message";
    }
}

trait DatabaseLogger {
    public function log(string $message): void {
        echo "DB: $message";
    }
}

class Application {
    use FileLogger, DatabaseLogger {
        FileLogger::log insteadof DatabaseLogger;
        DatabaseLogger::log as logToDatabase;
    }
}

$app = new Application();
$app->log("Error occurred");
$app->logToDatabase("Error occurred");

الناتج:

File: Error occurred
DB: Error occurred

يختار عامل التشغيل insteadof طريقة السمة التي سيتم استخدامها عند حدوث تعارض. في هذا المثال، تفوز FileLogger::log وتصبح طريقة log() ‏default. ينشئ عامل التشغيل as اسمًا مستعارًا، مما يتيح لك الوصول إلى طريقة السمة الأخرى باسم مختلف.

يمكنك أيضًا استخدام as لتغيير مستوى رؤية إحدى الطرق:

<?php
trait Greeting {
    public function sayHello(): void {
        echo "Hello!";
    }
}

class Person {
    use Greeting {
        sayHello as private;
    }
}

يجعل هذا sayHello() خاصًا داخل الفئة Person، رغم أنه عام في السمة. يمنحك حلّ التعارض تحكمًا دقيقًا في كيفية تكامل أساليب السمات مع فئاتك.

challenge icon

التحدي

سهل

لنبنِ نظام notification حيث يمكن للقنوات المختلفة إرسال الرسائل، لكننا need إلى resolve التعارضات عندما توفر سمات متعددة اسم method نفسه.

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

  • EmailNotifier.php: استخدم Create سمة تُسمى EmailNotifier مع method notify(string $message) تُرجع "Email: [message]".
  • SmsNotifier.php: استخدم Create سمة تُسمى SmsNotifier مع method notify(string $message) تُرجع "SMS: [message]".
  • AlertService.php: استخدم Create class باسم AlertService تستخدم both السمتين. بما أن both السمتين have method notify()، فستحتاج إلى resolve هذا conflict:
    • استخدم EmailNotifier::notify باعتباره method notify() الـ default
    • Create alias باسم notifyBySms لـ method SmsNotifier::notify
    أضف أيضًا method باسم notifyAll(string $message) يستدعي both notification methods ويُرجعهما combined في أسطر منفصلة.
  • main.php: ضمّن جميع الملفات اللازمة وCreate AlertService instance. ستتلقى input واحدًا: message من النوع string. اطبع ثلاثة lines:
    • نتيجة calling notify() باستخدام message
    • نتيجة calling notifyBySms() باستخدام message
    • نتيجة calling notifyAll() باستخدام message

يوضح هذا كيف يحل insteadof التعارض لتحديد method الخاصة بأي سمة التي تفوز عند وجود تعارض في التسمية، بينما يتيح لك as الاحتفاظ بإمكانية الوصول إلى method الخاصة بالسمة الأخرى تحت اسم مختلف.

جرّب بنفسك

<?php
require_once 'AlertService.php';

// اقرأ الإدخال
$message = trim(fgets(STDIN));

// TODO: أنشئ مثيلاً من AlertService

// TODO: اطبع نتيجة استدعاء notify() مع الرسالة

// TODO: اطبع نتيجة استدعاء notifyBySms() مع الرسالة

// TODO: اطبع نتيجة استدعاء notifyAll() مع الرسالة
?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت