الألياف (PHP 8.1)
جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 60 من 91.
Fibers هي ميزة في PHP 8.1 تتيح تنفيذ التعليمات البرمجية القابل للمقاطعة. بخلاف الدوال العادية التي تعمل من البداية إلى النهاية، يمكن لـ fiber إيقاف نفسه مؤقتًا أثناء التنفيذ واستئنافه لاحقًا، مع الحفاظ على حالته بين مرات الإيقاف المؤقت.
أنشئ fiber بتمرير callable إلى الصنف Fiber، ثم ابدأه باستخدام start():
<?php
$fiber = new Fiber(function(): void {
echo "Step 1\n";
Fiber::suspend();
echo "Step 2\n";
});
$fiber->start();
echo "Between steps\n";
$fiber->resume();
المخرجات:
Step 1
Between steps
Step 2يستمر الـ fiber في التنفيذ حتى يصل إلى Fiber::suspend()، ثم تعود السيطرة إلى الكود الرئيسي. يؤدي استدعاء resume() إلى متابعة التنفيذ من حيث توقّف.
يمكن لـ Fibers أيضًا تمرير قيم عند الإيقاف المؤقت والاستئناف:
<?php
$fiber = new Fiber(function(): string {
$value = Fiber::suspend("paused");
return "Received: $value";
});
$suspended = $fiber->start();
echo "$suspended\n";
$result = $fiber->resume("hello");
echo $result;
الخرج:
paused
Received: helloتُعدّ Fibers الأساس لأطر عمل PHP غير المتزامنة. ومع أنك لن تستخدمها مباشرةً في معظم التطبيقات، فإن فهمها يساعدك عند العمل مع مكتبات غير متزامنة تتعامل مع العمليات المتزامنة، مثل طلبات HTTP أو استعلامات قاعدة البيانات، من دون حظر.
التحدي
سهللنَبْنِ مُجدوِل مهام يوضّح كيف يمكن للألياف إيقاف التنفيذ مؤقتًا واستئنافه أثناء تمرير البيانات بين الليف والشيفرة الرئيسية. ستنشئ نظامًا يمكن فيه مقاطعة المهام، مما يتيح تنفيذ عمل آخر في الأثناء.
ستنظّم شيفرتك عبر ملفين:
TaskRunner.php: أنشئTaskRunnerclass يغلّف وظائف الليف لتشغيل المهام. يجب أن يقوم class بما يلي:- امتلاك خاصية private لتخزين مثيل من
Fiber - قبول اسم مهمة (من النوع string) في الباني باستخدام ترقية معاملات الباني
- امتلاك أسلوب
createTask(callable $task)ينشئ Fiber جديدًا باستخدام callable المُعطى ويخزّنه - امتلاك أسلوب
start()يبدأ الليف ويُرجع أي قيمة يعلّق الليف التنفيذ بها (أو قيمة الإرجاع النهائية) - امتلاك أسلوب
continue(mixed $value)يستأنف الليف باستخدام القيمة المُعطاة ويُرجع القيمة التالية التي يعلّق التنفيذ بها (أو قيمة الإرجاع النهائية) - امتلاك أسلوب
isFinished(): boolيُرجع ما إذا كان الليف قد أنهى تنفيذه
- امتلاك خاصية private لتخزين مثيل من
main.php: أدرِج ملف TaskRunner. ستتلقى مدخلين: اسم مهمة ورسالة لإرسالها إلى الليف.أنشئ
TaskRunnerباستخدام اسم المهمة المُعطى، ثم استخدمcreateTask()لتعريف مهمة تقوم بما يلي:- تعلّق التنفيذ أولًا باستخدام السلسلة النصية
"Waiting for input" - تتلقى قيمة عند استئناف التنفيذ
- تُرجع
"Completed: [received value]"
ابدأ المهمة واطبع ما تُرجعه عند تعليقها أول مرة. ثم اطبع
"Processing..."لإظهار تنفيذ العمل بين فترات إيقاف الليف مؤقتًا. وأخيرًا، استأنف الليف بتمرير إدخال الرسالة، واطبع النتيجة النهائية.- تعلّق التنفيذ أولًا باستخدام السلسلة النصية
يوضح هذا التحدي كيف تتيح الألياف تعدد المهام التعاوني. توقف مهمتك تنفيذها عند نقطة مناسبة، وتنّفذ الشيفرة الرئيسية عملًا آخر، ثم تستأنف المهمة باستخدام بيانات جديدة. ويحافظ الليف على حالته طوال الوقت، مستأنفًا التنفيذ من النقطة نفسها التي توقف عندها تمامًا.
جرّب بنفسك
<?php
require_once 'TaskRunner.php';
// قراءة المدخلات
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: أنشئ TaskRunner باسم المهمة المعطى
// TODO: استخدم createTask() لتعريف مهمة تقوم بـ:
// 1. First suspends with the string "Waiting for input"
// 2. تستقبل قيمة عند استئنافها
// 3. تُرجع "Completed: [received value]"
// TODO: ابدأ المهمة واطبع ما تُرجعه عند تعليقها لأول مرة
// TODO: اطبع "Processing..." لإظهار العمل الجاري بين توقفات الـ fiber
// TODO: تابع الـ fiber بتمرير مدخل الرسالة
// TODO: اطبع النتيجة النهائية
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت