Привет! Обещали — делаем: продолжаем серию мини-квизов, посвященных разным языкам программирования в нашем блоге (предыдущие: 1 (на знание Python, PHP, Golang и DevOps), 2 (полностью по Go)). Сегодняшний выпуск посвящён PHP.

Под катом — восемь вопросов, немного приключений программиста Брэда, одна странная последовательность и клёвый мерч в качестве призов. Квиз проходит до 4 июля.



Правила игры


Первому, кто правильно ответит на них, отправим набор сувенирки Авито: футболку с php-слоном, носки и холиварные кости (можно будет погадать, на каком бэкенд-языке и фронтенд-фреймворке будет написан ваш новый проект).

Десяти другим правильно ответившим отправим Авито-носки. Разыграем с помощью рандомайзера. Он же определит, к кому поедут ещё две футболки и набор костей.



Вопросы и варианты ответов


Вопрос 1


Что выведет код:

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

print_r($a);

Варианты ответов:

  1. Array(1, 2, 3)
  2. Array(1, 2, 2)
  3. Array(3, 2, 1)
  4. Ошибка

Вопрос 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



Вопрос 3


Однажды программист Брэд решил портировать одну библиотеку с Go на PHP, чтобы собрать звёзд на GitHub, и задался вопросом:

Возможна ли следующая конструкция?

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

Варианты ответов:

  1. Да, класс Foo должен реализовать интерфейс Traversable
  2. Да, класс Foo должен реализовывать методы интерфейса ArrayAccess
  3. Нет, будет ошибка, аргумент ...-оператора должен быть массивом

Вопрос 4


Какой алгоритм сортировки используется в сердце PHP для таких функций, как sort и тд?

Варианты ответов:

  1. нерекурсивный mergesort
  2. heapsort (вариация smoothsort Эдсгера Дейкстры)
  3. quicksort с разбиением по медиане из трех
  4. introsort

Вопрос 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. В одном случае использовано ключевое слово static :), но оно никак не влияет
  2. Результат getLambda2() нельзя привязать к какому-нибудь объекту
  3. Так нельзя писать: будет синтаксическая ошибка «Syntax error: static keyword used in wrong context»
  4. Closure из getLamda2() можно привязывать (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)
    

Вопрос 7


Что выведет код:

<?php

$a = 'a';

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

Варианты ответов:

  1. Будут выведены цифры от 0 до 39, а также Warning: A non-numeric value encountered in на каждой итерации
  2. Каждая итерация выведет ‘a’ + Warning
  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

Вопрос 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
    


Подведение итогов


Ответы на вопросы выложим апдейтом к посту в среду, 4 июля. Если будете решать — кладите ответы под спойлер, чтобы не портить другим фана. И не забывайте проверять личку Хабра после окончания квиза.

Enjoy!

Комментарии (34)


  1. miraage
    29.06.2018 14:21
    +2

    На вопрос 2 нет правильного ответа. Должно быть

    0 => flour
    1 => wheat
    cupcake
    


    1. meduza Автор
      29.06.2018 14:28

      Да, исправил. Спасибо за внимательность :)


  1. Dimd13
    29.06.2018 14:43

    Заголовок спойлера
    1) 2
    2) 3
    3) 1
    4) 3
    5) 4
    6) 4
    7) 3
    8) 3


  1. tatu
    29.06.2018 14:51

    Заголовок спойлера
    2 3 1 3 4 4 3 3


  1. 900DW1N
    29.06.2018 14:55

    Не ошибка ли в вариантах ответа третьего вопроса?

    Заголовок спойлера
    1. 2
    2. 3
    3. 1 (но подозреваю, что ошибка в вариантах ответа — даже без имплементации Traversable должно работать, выбрал этот вариант, как самое слабое условие)
    4. 3
    5. 4
    6. 4
    7. 3
    8. 3


  1. akeinhell
    29.06.2018 14:56

    Заголовок спойлера
    • 2
    • 3
    • 1
    • 3
    • 4
    • 4
    • 3
    • 3


  1. alekssamos
    29.06.2018 14:56

    Один
    Array ( [0] => 1 [1] => 2 [2] => 2 )


  1. Oniestel
    29.06.2018 15:01

    Заголовок спойлера
    1. 2
    2. 3
    3. 1
    4. 3
    5. 4
    6. 4
    7. 3
    8. 3


  1. opposit
    29.06.2018 15:03

    Заголовок спойлера
    1. 2
    2. 3
    3. 1
    4. 3
    5. 4
    6. 4
    7. 3
    8. 3


  1. DOC_tr
    29.06.2018 15:06

    Ответы
    1 — 2
    2 — 3
    3 — 1
    4 — 3
    5 — 4
    6 — 4
    7 — 3
    8 — 3


  1. slimus
    29.06.2018 15:29

    спойлер
    2
    3
    1
    3
    4
    4
    3
    3


  1. n0wheremany
    29.06.2018 16:01

    спойлер
    1-1
    2-3
    3-3 Навскидку
    4-1 навскидку
    5-4
    6-4
    7-3
    8-3


  1. egor_nullptr
    29.06.2018 16:09

    Заголовок спойлера
    1. 2
    2. 3
    3. 1
    4. 4
    5. 2
    6. 4
    7. 3
    8. 3


  1. regretful
    29.06.2018 16:21

    Заголовок спойлера
    1) 2
    2) 3
    3) 1
    4) 3
    5) 4
    6) 4
    7) 3
    8) 3


  1. mrbagfreeman
    29.06.2018 16:21

    Ответ
    1/2, 2/3, 3/1, 4/3, 5/4, 6/4, 7/3, 8/3.


  1. holdend
    29.06.2018 16:21

    Заголовок спойлера
    1) 2
    2) 3
    3) 1
    4) 3
    5) 4
    6) 4
    7) 3
    8) 3


  1. alexchromets
    29.06.2018 16:21

    Скрытый текст
    1.2
    2.3
    3.1
    4.3
    5.4
    6.4
    7.3
    8.3


  1. DjSebas
    29.06.2018 16:21
    +1

    Заголовок спойлера
    1) Ответ: 2. Array(1, 2, 2) т.к. во втором переборе в $value находится ссылка на последний элемент массива при первом переборе

    2) Ответ: 3. В 7 пыхе генераторы довольно сильно расширили, теперь можно получать делать getReturn. Давно не писал на 5, долго искал в чем подвох в задаче.

    3) Ответ: 1. На сколько я помню оператор… разворачивает итерабельные. А интерфейс Traversable напрямую вообще нельзя реализовывать.

    4) Ответ: 3.

    5) Ответ: 2. К статичным замыканиям нельзя биндить инстансы.

    6) Ответ: 4. Тут подвох в приоритете операторов. Хоть операторы && и and похожи они имеют разные приоритеты. Из-за этого в выражении $c = $a and $b; сначала будет присвоено значение переменной $c.

    7) Ответ: 3. Привет Perl)

    8) Ответ: 3. Ключевое слово yield будет означать что данный метод вернет генератор. Который ничего не выбросит.


  1. Donquih0te
    29.06.2018 16:21

    Spoiler

    2 3 1 3 4 4 3 3


  1. TexElless
    29.06.2018 16:21
    +1

    Ответы и чуть-чуть комментов для неочевидного
    1) 2 (но можно сделать unset($value) между циклами, чтобы пофиксить)
    2) 3
    3) 1
    4) 3
    5) $this нельзя использовать в контексте static функции, подозреваю что это 2
    6) 4 (потому что у and приоритет ниже чем у присваивания)
    7) 3 (да, пхп инкрементит строки по алфавиту)
    8) 3 (потому что test() возвращает генератор, но yield никогда не вызовется)


  1. Ni_san
    29.06.2018 16:21

    Заголовок спойлера
    1. 2
    2. 3
    3. 1
    4. 3
    5. 3
    6. 1
    7. 3
    8. 3


  1. Turik-us
    29.06.2018 16:21

    ответы
    1- 2
    2- 3
    3- 1
    4- 3
    5- 2
    6- 4
    7- 3
    8- 3


  1. klim0v
    29.06.2018 16:22

    Заголовок спойлера
    1-2
    2-3
    3-2
    4-3
    5-4
    6-4
    7-3
    8-3


  1. SVN
    29.06.2018 16:22

    Заголовок спойлера
    2 3 1 3 4 4 3 3


  1. AnthonySoprano
    29.06.2018 16:23
    +1

    По второму вопросу: какая версия PHP имеется в виду?
    Ведь из документации:

    Предостережение
    Если вы используете «yield» в контексте выражения (например, в правой части оператора присвоения), вы должны окружить «yield» круглыми скобками. Например, так правильно:
    $data = (yield $value);

    А вот это неправильно и вызовет ошибку синтаксиса в PHP 5:
    $data = yield $value;

    В PHP 7 этого ограничения нет.


    1. meduza Автор
      29.06.2018 16:30

      Речь про PHP 7


  1. Turik-us
    29.06.2018 16:46

    1- 2
    2- 3
    3- 1
    4- 3
    5- 4
    6- 4
    7- 3
    8- 3


  1. rraderio
    29.06.2018 17:23

    Заголовок спойлера
    1. 2
    2. 3
    3. 1
    4. 3
    5. 3
    6. 1
    7. 3
    8. 3


  1. SamDark
    29.06.2018 18:32

    Заголовок спойлера

    1 — 2
    2 — 3
    3 — 1
    4 — 3
    5 — 4
    6 — 4
    7 — 3
    8 — 3


  1. AdmAlexus
    29.06.2018 19:40

    PHP - зло, но приятное и доброе
    1. 2
    2. 3
    3. 1
    4. 3
    5. 4
    6. 4
    7. 3
    8. 3


  1. offlinewan
    29.06.2018 20:25

    Ответы
    1. 2
    2. 3
    3. 1
    4. 3
    5. 2
    6. 4
    7. 3
    8. 3


  1. voiceofnoise
    29.06.2018 20:25

    Заголовок спойлера
    1. 2
    2. 3
    3. 1
    4. 3
    5. 2
    6. 4
    7. 3
    8. 3


  1. andrey_96
    29.06.2018 20:25

    спойлер
    1) 2
    2) 3
    3) 1
    4) 3
    5) 2
    6) 4
    7) 3
    8) 3


  1. v0id
    29.06.2018 23:04

    Заголовок спойлера
    1. 2
    2. 3
    3. 1
    4. 3
    5. 4
    6. 4
    7. 3
    8. 3