PHP 8.6: دالة clamp() وPartial Function Application وكل ما ستغيّره قبل الترقية
ما الجديد في PHP 8.6 المقرر في 19 نوفمبر 2026؟ دالة clamp() وPartial Function Application وتغييرات الجلسات والإهمالات، وما تختبره قبل الترقية.
جدول إصدار PHP 8.6 وما معنى "قبل الإصدار"
بحسب php.watch فإن PHP 8.6 مجدول للإصدار العام في 19 نوفمبر 2026، وهو حاليًا في مرحلة الـ Release Candidates. هذا يعني أن قائمة الميزات مستقرة عمليًا، لكن التفاصيل قد تتغير حتى الإصدار النهائي، فتأكد من ملاحظات الإصدار الرسمية عند صدوره.
نصيحة عملية: جرّب مشروعك على نسخة RC في بيئة CI منفصلة الآن، ولا تنشرها في الإنتاج قبل الإصدار المستقر.
دالة clamp(): حصر القيمة بين حدّين
كل مطوّر كتب يومًا max($min, min($max, $value)) لحصر رقم الصفحة أو الكمية أو نسبة الخصم. PHP 8.6 يضيف دالة مباشرة لذلك. بحسب RFC الخاص بها فتوقيعها:
clamp(mixed $value, mixed $min, mixed $max): mixed
clamp(2, 1, 3); // 2
clamp(0, 1, 3); // 1
clamp(6, 1, 3); // 3
// مثال عملي: حدّ أقصى لعدد النتائج في الصفحة
$perPage = clamp((int) $request->query('per_page', 15), 1, 100);
سلوكها وحالاتها الخاصة
- تعمل بقواعد المقارنة المعتادة في PHP، لذا تدعم الأرقام والنصوص (ترتيبًا أبجديًا) وكائنات التاريخ.
- تُطلق
ValueErrorإذا كان$minأكبر من$max، أو إذا كان أحد الحدّينNAN. - إذا كانت القيمة نفسها
NANفتُرجَعNAN. - أُقرّ الـ RFC بتصويت 23 مقابل 3، مع 6 ممتنعين.
بما أنها دالة عامة جديدة باسم شائع، ابحث في مشروعك وحزمك عن دالة بنفس الاسم قبل الترقية، لأن تعريف دالة مكرر في المساحة العامة يسبب خطأ فادحًا. (الأسماء داخل namespace لا تتأثر.)
Partial Function Application: إنشاء Closure بحجّة ناقصة
هذه الميزة الأبرز نحويًا. بحسب RFC الذي أُقرّ بالإجماع (33 صوتًا بلا معارض) واستهدف PHP 8.6، يمكنك استدعاء دالة مع وضع ? مكان وسيط لم تحدده بعد، فتحصل على Closure تنتظر القيم الناقصة:
$allowed = ['admin', 'editor'];
// Closure تنتظر وسيطًا واحدًا هو القيمة المراد فحصها
$isAllowed = in_array(?, $allowed, true);
$isAllowed('admin'); // true
$isAllowed('guest'); // false
والرمز ... يعني "صفر أو أكثر من الوسائط المتبقية":
$c = stuff(1, 'hi', ...);
قيود يجب معرفتها
- لا يمكن تطبيقها جزئيًا على الـ constructors.
- لا تصلح مع الدوال التي تعتمد على الوسائط الديناميكية مثل
func_get_args()أوcompact()أوextract(). - لا يُسمح بـ placeholder موضعي بعد وسيط مُسمّى.
- تُقيَّم التعابير المعطاة كوسائط فورًا عند إنشاء الـ Closure، لا عند استدعائها لاحقًا. هذه نقطة تسبب مفاجآت إن مررت قيمة تتغير.
الفائدة الواضحة تظهر عند تمرير دالة كوسيط إلى array_filter أو array_map، حيث كنت تكتب Closure كاملة لمجرد تثبيت وسيط واحد:
// قبل
$admins = array_filter($roles, fn($role) => in_array($role, $allowed, true));
// بعد (PHP 8.6)
$admins = array_filter($roles, in_array(?, $allowed, true));
الناتج واحد، لكن النية أوضح: "هذه in_array ينقصها أول وسيط". وتذكّر أن $allowed تُقيَّم لحظة إنشاء الـ Closure، فلو عدّلت المصفوفة بعد ذلك فلن ينعكس التعديل عليها.
رسائل خطأ JSON أوضح
بحسب php.watch، تُظهر رسائل json_decode() الآن موضع الخطأ في المُدخل. المصدر المنشور في مقال بنجامين كروزا يعرض تحسّن الرسالة من "Syntax error" إلى صيغة مثل "Syntax error near location 3:1". إن كانت اختباراتك تقارن نص رسالة الخطأ حرفيًا فقد تفشل بعد الترقية.
تغييرات سلوكية قد تكسر اختباراتك
هذا الجزء الأهم لمن يرقّي تطبيقًا قائمًا:
- إعدادات الجلسات الآمنة افتراضيًا: بحسب Zend وبنجامين كروزا تتغير ثلاث قيم:
session.use_strict_modeمن 0 إلى 1، وsession.cookie_httponlyمن 0 إلى 1، وsession.cookie_samesiteمن فارغ إلىLax. إن كان تطبيقك يعتمد على جلسات عبر مواقع مختلفة (مثل تكامل يعتمد على cookies من طرف ثالث) فاختبره جيدًا. وإن كنت تستخدم Laravel فإعدادات الجلسة تُحدَّد غالبًا فيconfig/session.php، فراجع القيم التي تضبطها صراحة. trim()وأخواتها: تقصّ الآن محرف Form-Feed (\f) افتراضيًا (trimوltrimوrtrimوchop).array_filter(): تُطلقValueErrorعند تمرير قيمة غير صالحة لوسيط$modeبدل قبولها بصمت.- الإهمالات (Deprecations): يذكر مقال Zend ستًا وعشرين إهمالًا، أبرزها تحديد سلاسل الفلاتر بـ 16، وتثبيط إرجاع قيم من
__construct()و__destruct()، وإهمال دوال regex في mbstring بسبب محرك oniguruma غير المُصان. شغّل تطبيقك معerror_reporting(E_ALL)وراقب تحذيرات الإهمال.
ميزات أخرى تستحق التجربة
تذكر المصادر أيضًا إضافات منها: الـ enum المسمّى SortDirection لتوحيد اتجاه الفرز، والصنف Time\Duration لمدد زمنية بدقة نانوية، وتحسينات في الـ Streams، وإمكانية قراءة تعليقات التوثيق على الوسائط عبر ReflectionParameter::getDocComment()، والسماح بقيم افتراضية للخصائص readonly. هذه الأخيرة تتفاوت تفاصيلها بين المصادر، فارجع إلى ملاحظات الإصدار قبل الاعتماد عليها في الشيفرة.
هل تستعجل الترقية؟
ليس بالضرورة. الميزات الجديدة اختيارية ولن يتغير شيء في شيفرتك إن لم تستخدمها، أما التغييرات السلوكية (الجلسات، trim()، array_filter()) فتصيبك حتى لو لم تلمس الشيفرة. لذلك الترتيب المنطقي: اختبر أولًا لتعرف حجم الأثر، ثم قرّر موعد الترقية بحسب جاهزية الحزم وإطار العمل الذي تستخدمه، ثم ابدأ باستخدام clamp() وPFA تدريجيًا في الشيفرة الجديدة فقط.
كيف تستعد للترقية
- شغّل مجموعة الاختبارات على PHP 8.6 RC في CI، مع رفع مستوى التقارير لإظهار الإهمالات.
- ابحث في الشيفرة عن دوال عامة اسمها
clamp. - راجع الاختبارات التي تقارن رسائل أخطاء JSON حرفيًا.
- راجع سلوك الجلسات وملفات الـ cookies، خصوصًا مع تكاملات خارجية.
- تأكد من أن الحزم التي تعتمد عليها تعلن دعم 8.6 قبل الترقية في الإنتاج.
الخلاصة
PHP 8.6 ليس إصدارًا ثوريًا، لكنه يمنحك أدوات تقلل الضجيج في الشيفرة (clamp() وPFA) ويشدد الإعدادات الافتراضية للأمان. المهمة الحقيقية الآن ليست تعلّم الميزات الجديدة، بل اختبار تطبيقك على النسخة التجريبية لاكتشاف أثر تغييرات الجلسات والإهمالات قبل 19 نوفمبر.