اكتمال التصويت على بناء الجملة المختصرة للوظائف (51 صوتًا مؤيدًا ، مقابل 8).
كان:
$result = array_filter($paths, function ($v) use ($names) { return in_array($v, $names); });
أصبح:
$result = array_filter($paths, fn($v) => in_array($v, $names));
التفاصيل تحت خفض
بناء الجملة الجديد هو:
بناء الجملة
fn(_) => _
في توقيع دالة السهم ، كما هو الحال في وظيفة عادية ، يمكنك تحديد أنواع ، الإعدادات الافتراضية ، إلخ.
fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest;
تحذير! fn
كلمة رئيسية جديدة fn
، مما يعني عدم التوافق إلى الوراء!
أفكار بناء جملة أخرى (تم تجاهلها)
خيارات نظرت:
وبعض الآخرين
إغلاق المتغيرات
! المهم على عكس الإصدارات السابقة من php ، حيث كان من الضروري تعيين متغيرات قابلة للقفل بشكل صريح مع مشغل الاستخدام ، فإن وظيفة السهم تغلق ضمنيا النطاق الأصلي بالكامل.
فيما يلي الإدخالات المكافئة:
$y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; };
$ هذا المتغير يغلق تماما مثل أي متغير آخر. إذا كان هذا سلوكًا غير مرغوب فيه ، فيمكنك تعطيله باستخدام الكلمة الأساسية الثابتة .
class Test { public function method() { $fn = fn() => var_dump($this); $fn();
يحدث إغلاق المتغيرات في وظائف السهم حسب القيمة (على عكس لغة Go ، على سبيل المثال). أي لن يؤدي تغيير المتغيرات داخل دالة إلى تغيير المتغير في النطاق الأصل.
النتائج
لقد أصبح الرمز أكثر إحكاما بكثير ، وعلى الرغم من أنه ليس مضغوطًا كما هو الحال في جافا سكريبت وبعض اللغات الأخرى ، إلا أنه سيكون أكثر متعة في الكتابة:
$result = Collection::from([1, 2]) ->map(fn($v) => $v * 2) ->reduce(fn($tmp, $v) => $tmp + $v, 0); echo $result;
على عكس بعض اللغات الأخرى ، لا تدعم وظائف الأسهم في php عبارات متعددة مفصولة بحرف ما ;
لأن هذا (وفقًا لمؤلفي RFC) يتناقض مع فكرة بناء جملة مختزل. ربما سيتم تنقيح هذا في المستقبل.
سنناقش بالتأكيد وظائف السهم في php بالتفصيل في بودكاست Zinc Prod ، لذلك تأكد من الاشتراك.
رابط RFC