الـ 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 يلتقط نسبة الخصم، ثم استدعِ الـ closure مع السعر، واطبع السعر النهائي بعد الخصم.
تنسيق المدخلات: سطران - السطر الأول يحتوي على نسبة الخصم (رقم)، والسطر الثاني يحتوي على السعر الأصلي (رقم قد يحتوي على كسور عشرية)
المخرجات المتوقعة: السعر النهائي بعد تطبيق الخصم
ورقة مرجعية
تسمح الكلمة المفتاحية use للإغلاقات (closures) بالتقاط المتغيرات من نطاقها الأب (parent scope):
<?php
$message = "Welcome";
$greeting = function($name) use ($message) {
echo $message . ", " . $name . "!";
};
$greeting("Bob"); // المخرجات: Welcome, Bob!
?>يمكنك التقاط متغيرات متعددة عن طريق الفصل بينها بفاصلات: use ($var1, $var2).
جرّب بنفسك
<?php
// قراءة المدخلات
$discount = floatval(fgets(STDIN));
$price = floatval(fgets(STDIN));
// TODO: قم بإنشاء دالة مجهولة (anonymous function) تلتقط نسبة الخصم باستخدام 'use'
// يجب أن تأخذ الدالة معامل السعر وتعيد السعر النهائي بعد الخصم
// 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'مراجعة: ترتيب لوحة المتصدرين