Привет! Обещали — выполнили: продолжаем в нашем блоге серию мини-викторин, посвящённых разным языкам программирования (предыдущие: 1 (знание Python, PHP, Golang и DevOps) , 2 (полностью Го) ).
Сегодняшний выпуск посвящен PHP. Под катом восемь вопросов, несколько приключений программиста Брэда, одна странная последовательность и крутой мерч в качестве призов.
Викторина продлится до 4 июля.
УПД 2: По договоренности публикуем разбор заданий викторины.
Пояснения спрятаны под спойлер после правильных ответов.
Если у вас есть вопросы, задавайте их в комментариях.
УПД: Мы закончили принимать ответы.
Спасибо всем, кто принимал участие! Готовим анализ задачи.
Ответы на них — внутри текста, а победители — под спойлером.
Победители и финалисты PHP-викторины
Победитель
egor_nullptrЛауреаты
Мы случайным образом выбрали десять лучших участников, допустивших в своих ответах не более двух ошибок: Димд13 , слизистый , алексхроматы , Donquih0te , ТексЭллесс , СэмДарк , АдмАлексус , голос шума , Раз-Мик , Serj_By .
Запись розыгрыша
Бонус!
Для тех, кто допустил всего одну ошибку, мы дополнительно даем кубик холивара, с помощью которого вы сможете решить, на каком языке бэкенда и фреймворке фронтенда писать свой новый проект/или переделывать старый.Их получают: DJSebas , ТексЭллесс , Турик-нас , оффлайн , голос шума , andrey_96 , всемогущий восторг .
Правила игры
Первый Тому, кто ответит на них правильно, мы отправим набор сувениров на Авито: футболку со слоником PHP, носки и святые игральные кости (можете погадать, на каком бэкенд-языке и фронтенд-фреймворке будет написан ваш новый проект).Еще десять правильных ответов Отправим носки на Авито.
Давайте поиграем с помощью рандомайзера.
Он же определит, кто получит еще две футболки и набор игральных костей.
Вопросы и варианты ответов
Вопрос 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)
- Ошибка
Во время итерации последнего foreach значения из массива записываются в его последний элемент (поскольку $value — это ссылка).
Вот как будет выглядеть массив на каждой итерации второго цикла:
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
0 => flour
1 => wheat
cupcake
Объяснение Без комментариев.
Просто немного хитрый пример с генераторами.
Вопрос 3
Однажды программист Брэд решил портировать библиотеку с Go на PHP, чтобы собирать звезды на GitHub, и задался вопросом: Возможна ли следующая конструкция? <Эphp
print_r(.
(new Foo()));
Возможные ответы:
- Да, класс Foo должен реализовывать интерфейс Traversable.
- Да, класс Foo должен реализовывать методы интерфейса ArrayAccess.
- Нет, будет ошибка, аргумент .
-оператора должен быть массивом
От документация Распаковка аргументов:
Массивы и объекты, реализующие интерфейс Traversable, можно распаковать в список аргументов при передаче функции с помощью оператора .
Вопрос 4
Какой алгоритм сортировки используется в основе PHP для таких функций, как сортировка и т. д.? Возможные ответы:- нерекурсивная сортировка слиянием
- пирамидальная сортировка (вариант гладкой сортировки Дейкстры)
- быстрая сортировка, разделение по медиане трех
- интросорт
В документации упоминается использование быстрой сортировки, но противоречия здесь нет, поскольку интросорт — это гибридный алгоритм сортировки, в котором для небольшого количества элементов используется сортировка вставками, а позже применяется более быстрый алгоритм: быстрая сортировка или пирамидальная сортировка.
Вопрос 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() не может быть привязан ни к какому объекту.
- Так писать нельзя: будет синтаксическая ошибка «Синтаксическая ошибка: ключевое слово static использовано в неправильном контексте»
- Замыкание из getLamda2() может быть привязано (bindTo) только к классам.
Объяснение Метод 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)
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» + предупреждение.
- Странная последовательность:
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
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 значение «AA», тогда как в C a = «Z»; а++; установит a в '[' (значение 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
The end
Объяснение На первый взгляд может показаться, что функция не возвращает генератор, поскольку выражение доходности недостижимо.
Однако любая функция содержащий Выражение доходности автоматически становится функцией-генератором.
В оригинальном RFC было так написано .
В момент первой итерации генератор начинает выполнение кода функции с самого начала до первого доступного выражения доходности, но поскольку его нет, генератор завершает свою работу, не передавая в цикл никаких данных.
Подведение итогов
Ответы на вопросы опубликуем в обновлении поста в среду, 4 июля..
Если решитесь, поместите ответы под спойлер, чтобы не портить удовольствие другим.
И не забудьте зайти в личный кабинет Хабра после окончания викторины.
Наслаждаться! Теги: #php #викторина #программирование #Ненормальное программирование #php #Развлекательные задачи #Образовательный процесс в IT
-
Какая Ос У Вас На Основном Телефоне?
19 Oct, 24