Привет! Обещали — делаем: продолжаем серию мини-квизов, посвященных разным языкам программирования в нашем блоге (предыдущие: 1 (на знание Python, PHP, Golang и DevOps), 2 (полностью по Go)). Сегодняшний выпуск посвящён PHP.
Под катом — восемь вопросов, немного приключений программиста Брэда, одна странная последовательность и клёвый мерч в качестве призов. Квиз проходит до 4 июля.
Первому, кто правильно ответит на них, отправим набор сувенирки Авито: футболку с php-слоном, носки и холиварные кости (можно будет погадать, на каком бэкенд-языке и фронтенд-фреймворке будет написан ваш новый проект).
Десяти другим правильно ответившим отправим Авито-носки. Разыграем с помощью рандомайзера. Он же определит, к кому поедут ещё две футболки и набор костей.
Что выведет код:
Варианты ответов:
Что выведет код:
Варианты ответов:
Однажды программист Брэд решил портировать одну библиотеку с Go на PHP, чтобы собрать звёзд на GitHub, и задался вопросом:
Возможна ли следующая конструкция?
Варианты ответов:
Какой алгоритм сортировки используется в сердце PHP для таких функций, как sort и тд?
Варианты ответов:
Есть код:
Вопрос: есть ли разница между возвращаемыми значениями getLambda и getLambda2?
Варианты ответов:
Что выведет код:
Варианты ответов:
Что выведет код:
Варианты ответов:
Что выведет код:
Варианты ответов:
Ответы на вопросы выложим апдейтом к посту в среду, 4 июля. Если будете решать — кладите ответы под спойлер, чтобы не портить другим фана. И не забывайте проверять личку Хабра после окончания квиза.
Enjoy!
Под катом — восемь вопросов, немного приключений программиста Брэда, одна странная последовательность и клёвый мерч в качестве призов. Квиз проходит до 4 июля.
Правила игры
Первому, кто правильно ответит на них, отправим набор сувенирки Авито: футболку с php-слоном, носки и холиварные кости (можно будет погадать, на каком бэкенд-языке и фронтенд-фреймворке будет написан ваш новый проект).
Десяти другим правильно ответившим отправим Авито-носки. Разыграем с помощью рандомайзера. Он же определит, к кому поедут ещё две футболки и набор костей.
Вопросы и варианты ответов
Вопрос 1
Что выведет код:
<?php
$a = [1, 2, 3];
foreach($a as &$value) {}
foreach($a as $value) {}
print_r($a);
Варианты ответов:
- Array(1, 2, 3)
- Array(1, 2, 2)
- Array(3, 2, 1)
- Ошибка
Вопрос 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
Вопрос 3
Однажды программист Брэд решил портировать одну библиотеку с Go на PHP, чтобы собрать звёзд на GitHub, и задался вопросом:
Возможна ли следующая конструкция?
<?php
print_r(...(new Foo()));
Варианты ответов:
- Да, класс Foo должен реализовать интерфейс Traversable
- Да, класс Foo должен реализовывать методы интерфейса ArrayAccess
- Нет, будет ошибка, аргумент ...-оператора должен быть массивом
Вопрос 4
Какой алгоритм сортировки используется в сердце PHP для таких функций, как sort и тд?
Варианты ответов:
- нерекурсивный mergesort
- heapsort (вариация smoothsort Эдсгера Дейкстры)
- quicksort с разбиением по медиане из трех
- 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?
Варианты ответов:
- В одном случае использовано ключевое слово static :), но оно никак не влияет
- Результат getLambda2() нельзя привязать к какому-нибудь объекту
- Так нельзя писать: будет синтаксическая ошибка «Syntax error: static keyword used in wrong context»
- Closure из getLamda2() можно привязывать (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)
Вопрос 7
Что выведет код:
<?php
$a = 'a';
for ($i = 0; $i < 40; $i++) {
echo $a++, PHP_EOL;
}
Варианты ответов:
- Будут выведены цифры от 0 до 39, а также Warning: A non-numeric value encountered in на каждой итерации
- Каждая итерация выведет ‘a’ + Warning
- Странная последовательность:
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 2 3 32332 The end
1 2 3 The end
The end
32332 The end
Подведение итогов
Ответы на вопросы выложим апдейтом к посту в среду, 4 июля. Если будете решать — кладите ответы под спойлер, чтобы не портить другим фана. И не забывайте проверять личку Хабра после окончания квиза.
Enjoy!
Комментарии (34)
Dimd13
29.06.2018 14:43Заголовок спойлера1) 2
2) 3
3) 1
4) 3
5) 4
6) 4
7) 3
8) 3tatu
29.06.2018 14:51Заголовок спойлера2 3 1 3 4 4 3 3900DW1N
29.06.2018 14:55Не ошибка ли в вариантах ответа третьего вопроса?
Заголовок спойлера1. 2
2. 3
3. 1 (но подозреваю, что ошибка в вариантах ответа — даже без имплементации Traversable должно работать, выбрал этот вариант, как самое слабое условие)
4. 3
5. 4
6. 4
7. 3
8. 3akeinhell
29.06.2018 14:56Заголовок спойлера- 2
- 3
- 1
- 3
- 4
- 4
- 3
- 3
alekssamos
29.06.2018 14:56ОдинArray ( [0] => 1 [1] => 2 [2] => 2 )
Oniestel
29.06.2018 15:01Заголовок спойлера1. 2
2. 3
3. 1
4. 3
5. 4
6. 4
7. 3
8. 3opposit
29.06.2018 15:03Заголовок спойлера1. 2
2. 3
3. 1
4. 3
5. 4
6. 4
7. 3
8. 3DOC_tr
29.06.2018 15:06Ответы1 — 2
2 — 3
3 — 1
4 — 3
5 — 4
6 — 4
7 — 3
8 — 3slimus
29.06.2018 15:29спойлер2
3
1
3
4
4
3
3n0wheremany
29.06.2018 16:01спойлер1-1
2-3
3-3 Навскидку
4-1 навскидку
5-4
6-4
7-3
8-3egor_nullptr
29.06.2018 16:09Заголовок спойлера- 2
- 3
- 1
- 4
- 2
- 4
- 3
- 3
regretful
29.06.2018 16:21Заголовок спойлера1) 2
2) 3
3) 1
4) 3
5) 4
6) 4
7) 3
8) 3mrbagfreeman
29.06.2018 16:21Ответ1/2, 2/3, 3/1, 4/3, 5/4, 6/4, 7/3, 8/3.holdend
29.06.2018 16:21Заголовок спойлера1) 2
2) 3
3) 1
4) 3
5) 4
6) 4
7) 3
8) 3alexchromets
29.06.2018 16:21Скрытый текст1.2
2.3
3.1
4.3
5.4
6.4
7.3
8.3DjSebas
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 будет означать что данный метод вернет генератор. Который ничего не выбросит.Donquih0te
29.06.2018 16:21Spoiler2 3 1 3 4 4 3 3
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 никогда не вызовется)Ni_san
29.06.2018 16:21Заголовок спойлера1. 2
2. 3
3. 1
4. 3
5. 3
6. 1
7. 3
8. 3Turik-us
29.06.2018 16:21ответы1- 2
2- 3
3- 1
4- 3
5- 2
6- 4
7- 3
8- 3klim0v
29.06.2018 16:22Заголовок спойлера1-2
2-3
3-2
4-3
5-4
6-4
7-3
8-3SVN
29.06.2018 16:22Заголовок спойлера2 3 1 3 4 4 3 3AnthonySoprano
29.06.2018 16:23+1По второму вопросу: какая версия PHP имеется в виду?
Ведь из документации:
Предостережение
Если вы используете «yield» в контексте выражения (например, в правой части оператора присвоения), вы должны окружить «yield» круглыми скобками. Например, так правильно:
$data = (yield $value);
А вот это неправильно и вызовет ошибку синтаксиса в PHP 5:
$data = yield $value;
В PHP 7 этого ограничения нет.
miraage
На вопрос 2 нет правильного ответа. Должно быть
meduza Автор
Да, исправил. Спасибо за внимательность :)