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

الأصناف المجهولة

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

أحيانًا تحتاج إلى كائن بسيط يُستخدم لمرة واحدة دون عبء تعريف فئة كاملة. تتيح لك الفئات المجهولة إنشاء كائنات فورًا، في المكان الذي تحتاج إليها فيه. وتكون مفيدة بشكل خاص عند دمجها مع حقن التبعيات.

يتم تعريف anonymous class باستخدام new class متبوعًا بجسم class:

<?php
$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("Hello!");

المخرجات:

Log: Hello!

تصبح Anonymous classes قوية عند تنفيذ الواجهات. وهذا مثالي للاختبار أو عندما تحتاج إلى تنفيذ سريع دون إرباك قاعدة التعليمات البرمجية لديك باستخدام class تُستخدم مرة واحدة:

<?php
interface Notifier {
    public function send(string $message): string;
}

function notify(Notifier $notifier, string $msg): string {
    return $notifier->send($msg);
}

$result = notify(new class implements Notifier {
    public function send(string $message): string {
        return "Sent: $message";
    }
}, "Test message");

echo $result;

المخرجات:

Sent: Test message

يمكن لـ Anonymous classes أيضًا أن ترث من فئات أخرى، وتستخدم السمات، وتقبل وسائط constructor. وهي have وصولًا كاملًا إلى ميزات OOP — إذ تُعرَّف داخل السطر بدلًا من تعريفها في ملف منفصل. استخدمها عندما يكون تعريف class كاملًا مبالغًا فيه، لكنك لا تزال بحاجة إلى سلوك موجَّه للكائنات.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لتنسيق البيانات يوضّح قوة anonymous classes. بدلًا من إنشاء ملفات class منفصلة للتنفيذات البسيطة والمستخدمة مرة واحدة، ستستخدم anonymous classes لإنشاء تنفيذات سريعة في المكان الذي تحتاج إليها فيه.

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

  • FormatterInterface.php: عرّف interface باسم FormatterInterface يحتوي على method واحدة هي format(string $data): string. يحدّد هذا العقد الذي يجب على أي formatter اتباعه.
  • main.php: أدرج ملف interface وأنشئ class باسم DataProcessor يستخدم حقن التبعيات لقبول أي formatter. يجب أن تقوم class بما يلي:
    • قبول FormatterInterface في constructor الخاص بها
    • امتلاك method باسم process(string $data) تفوّض إلى formatter المحقون وتعيد result الخاص به

    ستتلقى مدخلين: نوع التنسيق ("upper" أو "reverse") وstring لتنسيقها.

    استنادًا إلى نوع التنسيق، أنشئ anonymous class تطبّق FormatterInterface:

    • بالنسبة إلى "upper": يجب أن تعيد method format() البيانات بعد تحويلها إلى uppercase
    • بالنسبة إلى "reverse": يجب أن تعيد method format() البيانات بعد عكسها

    احقن anonymous class في DataProcessor، واستدعِ process() باستخدام string المدخلة، ثم اطبع result.

يُعد هذا الأسلوب مثاليًا عندما تحتاج إلى تنفيذ سريع من دون إثقال قاعدة الشيفرة بملفات class تُستخدم مرة واحدة. تُنشأ anonymous class بشكل مضمن، وتطبّق interface المطلوبة، ويمكن تمريرها إلى أي مكان يُتوقَّع فيه استخدام تلك interface.

جرّب بنفسك

<?php
require_once 'FormatterInterface.php';

// TODO: أنشئ صنف DataProcessor الذي:
// - يقبل FormatterInterface في مُنشئه
// - يحتوي على دالة process(string $data) تفوّض إلى المنسّق

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

// TODO: Based on $formatType ("upper" or "reverse"), create an anonymous class
// التي تُنفّذ FormatterInterface
// - لـ "upper": يجب أن تُرجع format() النسخة بأحرف كبيرة من البيانات
// - لـ "reverse": يجب أن تُرجع format() النسخة المعكوسة من البيانات

// TODO: Create a DataProcessor with your anonymous class formatter
// استدعِ process() مع سلسلة الإدخال واطبع النتيجة

?>
quiz iconاختبر نفسك

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

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

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