مسابقة PHP ليوم الجمعة: بعض مغامرات المبرمج براد ، تسلسل غريب وجوائز

مرحبًا لقد وعدوا - نفعل ذلك: نواصل سلسلة المسابقات المصغرة المخصصة للغات البرمجة المختلفة في مدونتنا (سابقًا: 1 (لمعرفة Python و PHP و Golang و DevOps) ، 2 (تمامًا أثناء التنقل ) ). إصدار اليوم مخصص لـ PHP.

تحت القطع - ثمانية أسئلة ، بعض مغامرات المبرمج براد ، تسلسل واحد غريب وسلعة رائعة كجوائز. يستمر الاختبار حتى 4 يوليو.

UPD 2: كما هو متفق عليه ، نقوم بنشر تحليل مهام الاختبار. تم إخفاء التفسيرات تحت المفسد بعد الإجابات الصحيحة. إذا كانت لا تزال لديك أسئلة ، فاطرحها في التعليقات.

حدث: لقد انتهينا من قبول الإجابات. شكرا لكل من شارك! نحن نستعد لمراجعة المهام. الإجابات عليها داخل النص ، والفائزين والفائزين بالجوائز هم تحت المفسد.
الفائزون والفائزون في مسابقة PHP

الفائز


egor_nullptr

الفائزون بجوائز


لقد اخترنا عشوائيًا أفضل عشرة مشاركين لم يرتكبوا أكثر من خطأين في الإجابات: Dimd13 و slimus و alexchromets و Donquih0te و TexElless و SamDark و AdmAlexus و voiceofnoise و Raz-Mik و Serj_By .

رسم السجل


مكافأة!


بالنسبة لأولئك الذين ارتكبوا خطأ واحدًا فقط ، فإننا نقدم أيضًا عظامًا holivny ، والتي يمكنك من خلالها تحديد اللغة الخلفية وإطار الواجهة الأمامية لكتابة مشروعك الجديد / أو إعادة تصميم المشروع القديم. يتم استقبالهم: DjSebas و TexElless و Turik-us و offlinewan و voiceofnoise و andrey_96 و delight- allmight .




قواعد اللعبة


سنرسل مجموعة أدوات Avito للهدايا التذكارية إلى المجموعة الأولى التي ستجيب عليها بشكل صحيح: قميص مع فيل php وجوارب وعظام holivary (سيكون من الممكن تخمين اللغة الخلفية وإطار الواجهة الأمامية الذي سيتم كتابة مشروعك الجديد).

سنرسل Avito-socks إلى عشرة آخرين أجابوا بشكل صحيح . دعنا نلعب بمساعدة عشوائي. سيحدد من الذي سيرتدي قميصين إضافيين ومجموعة من العظام.



خيارات الأسئلة والأجوبة


السؤال 1


ماذا سينتج الكود:

<?php $a = [1, 2, 3]; foreach($a as &$value) {} foreach($a as $value) {} print_r($a); 

خيارات الإجابة:

  1. الصفيف (1 ، 2 ، 3)
  2. الصفيف (1 ، 2 ، 2)
  3. الصفيف (3 ، 2 ، 1)
  4. خطأ

إجابة صحيحة
الصفيف (1 ، 2 ، 2)

شرح
نظرًا لأن المتغيرات التي تم إنشاؤها في الحلقة تبقى في php حية بعد اكتمالها ، فإن متغير القيمة $ في بداية الحلقة الثانية هو مرجع للعنصر الأخير من الصفيف. أثناء تكرار foreach الأخير ، تتم كتابة القيم من المصفوفة إلى العنصر الأخير (حيث أن القيمة $ هي مرجع). سيبدو هذا كمصفوفة عند كل تكرار للحلقة الثانية:
1. [1، 2، 1]
2. [1 ، 2 ، 2]
3. [1 ، 2 ، 2]

السؤال 2


ماذا سينتج الكود:

 <?php function sowCrops() { return 'wheat'; } function millWheat() { return 'flour'; } function bake($flour) { return 'cupcake'; } function generator() { $flour = yield millWheat(); $wheat = yield sowCrops(); return bake($flour); }; $gen = generator(); foreach ($gen as $key => $value) { echo $key . ' => ' . $value . PHP_EOL; } echo $gen->getReturn(); 

خيارات الإجابة:

  1.   0 => flour 1 => wheat 

  2.   0 => wheat 1 => flour 2 => cupcake 

  3.  0 => flour 1 => wheat cupcake 

  4.  cupcake 



إجابة صحيحة
4.
 0 => flour 1 => wheat cupcake 



شرح
لا تعليقات. مجرد مثال صعب مع المولدات.

السؤال 3


ذات مرة ، قرر المبرمج براد نقل مكتبة واحدة من Go إلى PHP لجمع النجوم على GitHub ، وتساءل:

هل البناء التالي ممكن؟

 <?php print_r(...(new Foo())); 

خيارات الإجابة:

  1. نعم ، يجب أن تطبق فئة Foo واجهة Traversable
  2. نعم ، يجب أن تطبق فئة Foo أساليب واجهة ArrayAccess
  3. لا ، سيكون هناك خطأ ، يجب أن تكون الوسيطة ...- صفيف

إجابة صحيحة
1. نعم ، يجب أن تطبق فئة Foo واجهة Traversable

شرح
كل شيء بسيط هنا. من وثائق Argument Unpacking:
يمكن تفكيك المصفوفات والكائنات التي تنفذ واجهة Traversable في قائمة وسيطات عند تمريرها إلى وظيفة باستخدام عامل التشغيل ...


السؤال 4


ما هي خوارزمية الفرز المستخدمة في قلب PHP لوظائف مثل الفرز ، وما إلى ذلك؟

خيارات الإجابة:

  1. دمج غير متكرر
  2. heapsort (اختلاف Edsger Dijkstra سلسس)
  3. متوسط ​​Quicksort من ثلاثة
  4. introsort

إجابة صحيحة
4. introsort

شرح
مستخدم من قبل introsort. يمكن عرض رمز المصدر على جيثب . تشير الوثائق إلى استخدام التصنيف السريع ، ولكن لا يوجد أي تناقض هنا ، لأن المقدمة هي خوارزمية فرز هجينة ، حيث يتم استخدام فرز الإدراج لعدد صغير من العناصر ، وبعد ذلك يتم استخدام خوارزمية أسرع: فرز سريع أو heapsort.


السؤال 5


يوجد رمز:

 <?php class Factory { public function getLambda(): Closure { return function () { printf("Here I am (%s)!\n", get_class($this)); }; } public function getLambda2(): Closure { return static function () { printf("Here I am (%s)!\n", get_class($this)); }; } } 

السؤال: هل هناك فرق بين قيم إرجاع getLambda و getLambda2؟

خيارات الإجابة:

  1. في حالة واحدة ، يتم استخدام الكلمة الأساسية الثابتة :) ، لكنها لا تؤثر
  2. لا يمكن ربط نتيجة getLambda2 () بأي كائن
  3. لذلك لا يمكنك الكتابة: سيكون هناك خطأ في بناء الجملة "خطأ في البنية: كلمة رئيسية ثابتة مستخدمة في سياق خاطئ"
  4. يمكن إغلاق من getLamda2 () فقط (bindTo) للفصول

إجابة صحيحة
2. لا يمكن ربط نتيجة getLambda2 () بأي كائن

شرح
ترجع الطريقة getLambda2 () دالة مجهولة ثابتة لا يمكن ربطها بكائن من خلال الطريقة -> bindTo (). استخدامها نادر في التعليمات البرمجية ، ولكن لا يزال

السؤال 6


ماذا سينتج الكود:

 <?php $a = true; $b = false; $c = $a and $b; $d = $a && $b; var_dump($c); var_dump($d); 

خيارات الإجابة:

  1.  bool(false) bool(false) 
  2.  bool(false) bool(true) 
  3.  bool(true) bool(true) 
  4.  bool(true) bool(false) 

إجابة صحيحة
4.
 bool(true) bool(false) 


شرح
الفرق بين && و وفي الأولوية. التعبير $ d = $ a && $ b يعمل مثل $ d = ($ a && $ b). لكن التعبير $ c = $ a و $ b يعمل بشكل مختلف ويمكن تمثيله كـ (($ c = $ a) و $ b).

السؤال 7


ماذا سينتج الكود:

 <?php $a = 'a'; for ($i = 0; $i < 40; $i++) { echo $a++, PHP_EOL; } 

خيارات الإجابة:

  1. سيتم عرض الأرقام من 0 إلى 39 ، بالإضافة إلى تحذير: قيمة غير رقمية مصادفة في كل تكرار
  2. كل تكرار سيخرج "تحذير" +
  3. تسلسل غريب:
     a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an 

إجابة صحيحة
3. تسلسل غريب:
 a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an 


شرح
لا يعلم الجميع ، ولكن يمكن تطبيق عامل الزيادة على الأحرف. من التوثيق:
يتبع PHP اصطلاحات Perl (على عكس C) فيما يتعلق بالعمليات الحسابية مع متغيرات الأحرف. على سبيل المثال ، في PHP و Perl $ a = 'Z'؛ $ a ++ ؛ سيتم تعيين $ a على 'AA' ، بينما في C a = 'Z' ؛ أ ++ ؛ تعيين قيمة لـ "[" (قيمة ASCII لـ "Z" هي 90 ، وقيمة ASCII لـ "[" هي 91).


السؤال 8


ماذا سينتج الكود:

 <?php class TestMe { public function test() { if (0) { yield 32332; } return [1,2,3]; } } $t = new TestMe(); foreach ($t->test() as $id) { echo $id, PHP_EOL; } echo "The end", PHP_EOL; 

خيارات الإجابة:

  1.  1 2 3 32332 The end 

  2.  1 2 3 The end 

  3.  The end 

  4.  32332 The end 


إجابة صحيحة
3.
 The end 



شرح
للوهلة الأولى ، قد يبدو أن الدالة لا تُرجع مولدًا ، لأن التعبير الناتج لا يمكن الوصول إليه. ومع ذلك ، فإن أي وظيفة تحتوي على تعبير خضوع تصبح تلقائيًا وظيفة مولد. يقول RFC الأصلي بذلك. في وقت التكرار الأول ، يبدأ المولد في تنفيذ رمز الوظيفة من البداية إلى أول تعبير إنتاج متاح ، ولكن نظرًا لعدم وجوده ، ينهي المولد عمله دون نقل أي بيانات إلى الحلقة.

الملخص


سننشر إجابات على الأسئلة عن طريق تحديث المنشور يوم الأربعاء ، 4 يوليو . إذا قررت - ضع الإجابات تحت المفسد حتى لا تفسد متعة الآخرين. ولا تنس التحقق من حساب هبر بعد انتهاء الاختبار.

استمتع!

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


All Articles