الأصناف المجهولة
جزء من قسم البرمجة كائنية التوجه في رحلة 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 كاملًا مبالغًا فيه، لكنك لا تزال بحاجة إلى سلوك موجَّه للكائنات.
التحدي
سهللنَبْنِ نظامًا لتنسيق البيانات يوضّح قوة 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": يجب أن تعيد methodformat()البيانات بعد تحويلها إلى uppercase - بالنسبة إلى
"reverse": يجب أن تعيد methodformat()البيانات بعد عكسها
احقن 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() مع سلسلة الإدخال واطبع النتيجة
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)تدرّب بنفسك: مترجم PHP عبر الإنترنت