البرمجة الوظيفية في PHP: المستوى المتقدم
ترتبط PHP تقليديًا بالأنماط الأمرية والموجهة للكائنات، لكن اللغة الحديثة (خاصة من الإصدار 7.4 فما فوق) توفر أدوات قوية لتطبيق النموذج الوظيفي. في هذه المقالة، سندرس المفاهيم المتقدمة للبرمجة الوظيفية (FP) في PHP والتي ستساعدك على كتابة كود أكثر قابلية للتنبؤ والاختبار والتعبير.
1. الدوال النقية وثبات البيانات
في جوهر البرمجة الوظيفية توجد الدوال النقية — وهي دوال:
- تعتمد فقط على وسائطها (لا تستخدم متغيرات عامة أو حالة خارج النطاق)؛
- لا تسبب تأثيرات جانبية (لا تعدل بيانات خارجية، لا تكتب إلى ملفات، لا ترسل طلبات HTTP)؛
- لنفس بيانات الإدخال، تعيد دائمًا نفس النتيجة.
في PHP، يُستخدم ثبات البيانات بنشاط لضمان نقاء الدوال. بدلاً من تغيير المصفوفات أو الكائنات الموجودة، يتم إنشاء نسخ مع التعديلات.
<?php// دالة غير نقية (تستخدم مصفوفة عامة)$globalData = [1, 2, 3];function addElementImpure($value) { global $globalData; $globalData[] = $value; // تأثير جانبي return $globalData;}
// دالة نقية (تعيد مصفوفة جديدة)function addElementPure(array $data, $value): array { $newData = $data; $newData[] = $value; return $newData;}
$original = [1, 2, 3];$modified = addElementPure($original, 4);// $original تبقى [1, 2, 3]، $modified = [1, 2, 3, 4]?>2. الإغلاقات والتقاط المتغيرات
الإغلاقات في PHP هي دوال مجهولة يمكنها التقاط المتغيرات من النطاق الأصلي باستخدام الكلمة المفتاحية use. هذا هو الأساس لإنشاء دوال ذات ترتيب أعلى.
من المهم التمييز بين الالتقاط بالقيمة (الافتراضي) والالتقاط بالمرجع (&use). في سياق البرمجة الوظيفية، يفضل الالتقاط بالقيمة لتجنب كسر النقاء.
<?php$multiplier = 3;
// إغلاق يلتقط $multiplier بالقيمة$multiply = function ($value) use ($multiplier) { return $value * $multiplier;};
echo $multiply(5); // 15
// مثال على دالة ذات ترتيب أعلى تعيد إغلاقًاfunction createGreeter(string $greeting): Closure { return function (string $name) use ($greeting) { return "{$greeting}, {$name}!"; };}
$sayHello = createGreeter('مرحبًا');echo $sayHello('العالم'); // مرحبًا، العالم!?>3. الكيرية والتطبيق الجزئي
الكيرية هي تحويل دالة تأخذ عدة وسائط إلى سلسلة من الدوال، كل منها يأخذ وسيطًا واحدًا. التطبيق الجزئي هو تثبيت بعض الوسائط للحصول على دالة جديدة بعدد أقل من المعاملات.
PHP لا تدعم الكيرية بشكل مدمج، ولكن يمكن تنفيذها باستخدام الإغلاقات.
<?php// دالة عاديةfunction add(int $a, int $b, int $c): int { return $a + $b + $c;}
// النسخة المكيرية$curriedAdd = function (int $a) { return function (int $b) use ($a) { return function (int $c) use ($a, $b) { return $a + $b + $c; }; };};
echo $curriedAdd(1)(2)(3); // 6
// التطبيق الجزئي باستخدام دالة مساعدةfunction partial(callable $fn, ...$fixedArgs): Closure { return function (...$remainingArgs) use ($fn, $fixedArgs) { return $fn(...array_merge($fixedArgs, $remainingArgs)); };}
$addFive = partial('add', 2, 3);echo $addFive(10); // 15 (2 + 3 + 10)?>4. تركيب الدوال وخطوط الأنابيب
تركيب الدوال يسمح لك بدمج عدة دوال بسيطة في دالة واحدة معقدة، مع تمرير النتيجة