وظائف السهم في PHP 7.4


وظائف السهم ، وتسمى أيضًا عمليات الإغلاق القصيرة ، هي طريقة جيدة لكتابة رمز نظيف في PHP. سيكون هذا النوع من الكتابة مفيدًا عند تمرير عمليات الإغلاق إلى وظائف مثل array_map أو array_filter .


مثال:


 //   Post $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts); 

اعتاد أن يكتب مثل هذا:


 $ids = array_map(function ($post) { return $post->id; }, $posts); 

باختصار:


  • متاح منذ PHP 7.4
  • ابدأ بالكلمة الرئيسية fn
  • يمكن أن يكون لها تعبير واحد فقط ، وهو أيضًا قيمة الإرجاع.
  • غير معتمد return
  • نوع hintihg معتمد في الوسائط وقيم الإرجاع

الطريقة النمطية لكتابة المثال أعلاه:


 $ids = array_map(fn(Post $post): int => $post->id, $posts); 

شيئان مهمان آخران:


  • مشغل متغير معتمد
  • يتم دعم الروابط لكل من الوسيطات وقيم الإرجاع

إذا كنت تريد إرجاع قيمة حسب المرجع ، استخدم بناء الجملة التالي:


 fn&($x) => $x 

تقوم وظائف السهم بتنفيذ نفس الوظيفة التي تتوقعها من عمليات الإغلاق العادية ، فهي تحتوي فقط على تعبير واحد.


لا متعدد الخطوط


تقرأ هذا صحيح: يمكن أن تحتوي الدوائر القصيرة على تعبير واحد فقط. هذا يعني أنه لا يمكن أن يكون لديك خطوط متعددة فيها.


الحجة هي هذا: الهدف من الدوائر القصيرة هو تقليل الفعل. fn ، بالتأكيد أقصر من function بكل معنى الكلمة. تخطي function return الكلمات الرئيسية لا يغير شيئًا ، لكنه يجعل الكود أكثر قابلية للقراءة.


هل توافق على هذا الرأي؟ في الوقت نفسه ، مع بناء الجملة الجديد لوظائف سطر واحد ، هناك العديد من الخطوط المتعددة التي لن يتم تثبيتها بواسطة هذه الترقية.


نأمل ، في المستقبل ، سيكون هناك RFC مع إعلان قصير ووظائف متعددة الخطوط ، ولكن حتى الآن هذه مجرد أحلامي.


متغيرات من النطاق الخارجي


هناك اختلاف كبير آخر بين الأخطاء القصيرة والعادي وهو أن الأولى لا تتطلب استخدام الكلمة الأساسية "الاستخدام" للوصول إلى البيانات من نطاق خارجي.


 $modifier = 5; array_map(fn($x) => $x * $modifier, $numbers); 

من المهم ملاحظة أنه لا يمكنك تعديل هذه المتغيرات. ترتبط القيم بالقيمة ، وليس بالرجوع إليها. هذا يعني أنه يمكنك تعديل $modifier داخل دائرة كهربائية قصيرة ، ولكن هذا لن يؤثر على متغير $modifier الموجود خارج.


الاستثناء الوحيد هو $this ، والتي ستعمل بنفس الطريقة تمامًا كما في الإصدار العادي:


 array_map(fn($x) => $x * $this->modifier, $numbers); 

الفرص المستقبلية


لقد ذكرت بالفعل فكرة الدارة القصيرة المتعددة الخطوط أعلاه. هناك اقتراح مفيد آخر وهو السماح باستخدام بناء جملة قصير في الفصول الدراسية ، على سبيل المثال للأحرف والأدوات:


 class Post { private $title; fn getTitle() => $this->title; } 

بشكل عام ، تعد وظائف السهم ميزة جيدة للغاية ، رغم أنه لا يزال هناك مجال للتحسين.


هل لديك أي أفكار حول هذا؟

Source: https://habr.com/ru/post/ar476242/


All Articles