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

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

خيارات الأسئلة والأجوبة
السؤال 1
ماذا سينتج الكود:
<?php $a = [1, 2, 3]; foreach($a as &$value) {} foreach($a as $value) {} print_r($a);
خيارات الإجابة:- الصفيف (1 ، 2 ، 3)
- الصفيف (1 ، 2 ، 2)
- الصفيف (3 ، 2 ، 1)
- خطأ
إجابة صحيحةالصفيف (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();
خيارات الإجابة: 0 => flour 1 => wheat
0 => wheat 1 => flour 2 => cupcake
0 => flour 1 => wheat cupcake
cupcake
إجابة صحيحة4.
0 => flour 1 => wheat cupcake
شرحلا تعليقات. مجرد مثال صعب مع المولدات.
السؤال 3
ذات مرة ، قرر المبرمج براد نقل مكتبة واحدة من Go إلى PHP لجمع النجوم على GitHub ، وتساءل:
هل البناء التالي ممكن؟
<?php print_r(...(new Foo()));
خيارات الإجابة:- نعم ، يجب أن تطبق فئة Foo واجهة Traversable
- نعم ، يجب أن تطبق فئة Foo أساليب واجهة ArrayAccess
- لا ، سيكون هناك خطأ ، يجب أن تكون الوسيطة ...- صفيف
إجابة صحيحة1. نعم ، يجب أن تطبق فئة Foo واجهة Traversable
شرحكل شيء بسيط هنا. من
وثائق Argument Unpacking:
يمكن تفكيك المصفوفات والكائنات التي تنفذ واجهة Traversable في قائمة وسيطات عند تمريرها إلى وظيفة باستخدام عامل التشغيل ...
السؤال 4
ما هي خوارزمية الفرز المستخدمة في قلب PHP لوظائف مثل الفرز ، وما إلى ذلك؟
خيارات الإجابة:- دمج غير متكرر
- heapsort (اختلاف Edsger Dijkstra سلسس)
- متوسط Quicksort من ثلاثة
- 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؟
خيارات الإجابة:- في حالة واحدة ، يتم استخدام الكلمة الأساسية الثابتة :) ، لكنها لا تؤثر
- لا يمكن ربط نتيجة getLambda2 () بأي كائن
- لذلك لا يمكنك الكتابة: سيكون هناك خطأ في بناء الجملة "خطأ في البنية: كلمة رئيسية ثابتة مستخدمة في سياق خاطئ"
- يمكن إغلاق من 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);
خيارات الإجابة: bool(false) bool(false)
bool(false) bool(true)
bool(true) bool(true)
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; }
خيارات الإجابة:- سيتم عرض الأرقام من 0 إلى 39 ، بالإضافة إلى تحذير: قيمة غير رقمية مصادفة في كل تكرار
- كل تكرار سيخرج "تحذير" +
- تسلسل غريب:
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 2 3 32332 The end
1 2 3 The end
The end
32332 The end
شرحللوهلة الأولى ، قد يبدو أن الدالة لا تُرجع مولدًا ، لأن التعبير الناتج لا يمكن الوصول إليه. ومع ذلك ، فإن أي وظيفة
تحتوي على تعبير خضوع تصبح تلقائيًا وظيفة مولد.
يقول RFC الأصلي بذلك. في وقت التكرار الأول ، يبدأ المولد في تنفيذ رمز الوظيفة من البداية إلى أول تعبير إنتاج متاح ، ولكن نظرًا لعدم وجوده ، ينهي المولد عمله دون نقل أي بيانات إلى الحلقة.
الملخص
سننشر إجابات على الأسئلة عن طريق تحديث المنشور يوم الأربعاء ، 4 يوليو . إذا قررت - ضع الإجابات تحت المفسد حتى لا تفسد متعة الآخرين. ولا تنس التحقق من حساب هبر بعد انتهاء الاختبار.
استمتع!