الـ Closures وكلمة 'use'
جزء من قسم Logic & Flow في رحلة PHP على Coddy — الدرس 2 من 68.
بشكل افتراضي، لا يمكن للدوال المجهولة (anonymous functions) الوصول إلا إلى المتغيرات التي يتم تمريرها إليها كمعاملات. ولكن ماذا لو كنت بحاجة إلى أن تصل دالة الإغلاق (closure) الخاصة بك إلى متغير من النطاق المحيط؟ هنا يأتي دور الكلمة المفتاحية use.
تسمح الكلمة المفتاحية use للانغلاق (closure) بـ "التقاط" المتغيرات من نطاقها الأب واستخدامها داخل الدالة:
<?php
$message = "Welcome";
$greeting = function($name) use ($message) {
echo $message . ", " . $name . "!";
};
$greeting("Bob"); // المخرجات: Welcome, Bob!
?>لاحظ كيف تم تعريف $message خارج الدالة، ولكن من خلال تضمين use ($message) بعد قائمة المعاملات، يمكن للـ closure الوصول إلى هذا المتغير واستخدامه. يمكنك التقاط متغيرات متعددة عن طريق الفصل بينها بفاصلات: use ($var1, $var2).
تجعل هذه الميزة الـ closures أكثر قوة بكثير، مما يسمح لها بالعمل مع البيانات من سياقها المحيط مع الاستمرار في الحفاظ على مرونة الدوال المجهولة (anonymous functions).
التحدي
سهلأنشئ دالة مجهولة (anonymous function) تلتقط نسبة الخصم من النطاق المحيط باستخدام الكلمة المفتاحية use. يجب أن تأخذ الدالة السعر كمعامل (parameter) وتعيد السعر النهائي بعد تطبيق الخصم.
ستتلقى مدخلين: نسبة الخصم والسعر الأصلي. اقرأ كلا المدخلين، وأنشئ إغلاقًا (closure) يلتقط نسبة الخصم، واستدعِ الإغلاق مع السعر، واطبع السعر النهائي بعد الخصم.
تنسيق المدخلات: سطران - السطر الأول يحتوي على نسبة الخصم (رقم)، والسطر الثاني يحتوي على السعر الأصلي (رقم قد يحتوي على كسور عشرية)
المخرجات المتوقعة: السعر النهائي بعد تطبيق الخصم
جرّب بنفسك
<?php
// قراءة المدخلات
$discount = floatval(fgets(STDIN));
$price = floatval(fgets(STDIN));
// TODO: إنشاء دالة مجهولة (anonymous function) تلتقط نسبة الخصم باستخدام 'use'
// يجب أن تأخذ الدالة معامل السعر price وتعيد السعر النهائي بعد الخصم
// TODO: استدعاء الـ closure مع السعر وتخزين النتيجة
// طباعة السعر النهائي
echo $finalPrice;
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1الدوال المتقدمة
الدوال المجهولةالـ Closures وكلمة 'use'دوال السهمدوال الـ Callbackاستخدام 'call_user_func'دوال المتغيراتالتمرير بالمرجعالدوال العوديةمراجعة: مزيج الدوال4المصفوفات متعددة الأبعاد
إنشاء مصفوفة ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادتعديل عناصر المصفوفة ثنائية الأبعادالتكرار باستخدام الحلقات المتداخلةالمصفوفات الترابطية ثنائية الأبعادمراجعة: تمرين الشبكة البسيطة2معالجة المصفوفات المتقدمة
الإضافة باستخدام 'array_push'الحذف باستخدام 'array_pop'الإضافة باستخدام 'array_unshift'الحذف باستخدام 'array_shift'دمج المصفوفات المفهرسةدمج المصفوفات الترابطيةالاستخراج باستخدام 'array_slice'القيم باستخدام 'in_array'المفاتيح باستخدام 'array_search'مراجعة: تمرين قائمة التشغيل3ترتيب المصفوفات
ترتيب المصفوفات المفهرسة تصاعدياًترتيب المصفوفات المفهرسة تنازلياًترتيب المصفوفات الترابطية حسب القيمةترتيب المصفوفات الترابطية حسب المفتاحالترتيب بالترتيب الطبيعيالترتيب المخصص باستخدام 'usort'مراجعة: ترتيب لوحة المتصدرين