Пятничная Php-Викторина: Немного Приключений Программиста Брэда, Одна Странная Последовательность И Призы

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

Сегодняшний выпуск посвящен PHP. Под катом восемь вопросов, несколько приключений программиста Брэда, одна странная последовательность и крутой мерч в качестве призов.

Викторина продлится до 4 июля.

УПД 2: По договоренности публикуем разбор заданий викторины.

Пояснения спрятаны под спойлер после правильных ответов.

Если у вас есть вопросы, задавайте их в комментариях.

УПД: Мы закончили принимать ответы.

Спасибо всем, кто принимал участие! Готовим анализ задачи.

Ответы на них — внутри текста, а победители — под спойлером.

Победители и финалисты PHP-викторины



Победитель

egor_nullptr

Лауреаты

Мы случайным образом выбрали десять лучших участников, допустивших в своих ответах не более двух ошибок: Димд13 , слизистый , алексхроматы , Donquih0te , ТексЭллесс , СэмДарк , АдмАлексус , голос шума , Раз-Мик , Serj_By .

Запись розыгрыша

Бонус!

Для тех, кто допустил всего одну ошибку, мы дополнительно даем кубик холивара, с помощью которого вы сможете решить, на каком языке бэкенда и фреймворке фронтенда писать свой новый проект/или переделывать старый.

Их получают: DJSebas , ТексЭллесс , Турик-нас , оффлайн , голос шума , andrey_96 , всемогущий восторг .



Пятничная PHP-викторина: немного приключений программиста Брэда, одна странная последовательность и призы



Правила игры

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

Еще десять правильных ответов Отправим носки на Авито.

Давайте поиграем с помощью рандомайзера.

Он же определит, кто получит еще две футболки и набор игральных костей.



Пятничная PHP-викторина: немного приключений программиста Брэда, одна странная последовательность и призы



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



Вопрос 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 переменные, созданные в цикле, остаются активными после его завершения, в начале второго цикла переменная $value является ссылкой на последний элемент массива.

Во время итерации последнего 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();

Возможные ответы:



  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. Объяснение Здесь все просто.

От документация Распаковка аргументов:

Массивы и объекты, реализующие интерфейс Traversable, можно распаковать в список аргументов при передаче функции с помощью оператора .



Вопрос 4

Какой алгоритм сортировки используется в основе PHP для таких функций, как сортировка и т. д.? Возможные ответы:
  1. нерекурсивная сортировка слиянием
  2. пирамидальная сортировка (вариант гладкой сортировки Дейкстры)
  3. быстрая сортировка, разделение по медиане трех
  4. интросорт
Правильный ответ 4.интросорт Объяснение Используется интросорт. Исходный код можно просмотреть по адресу Гитхаб .

В документации упоминается использование быстрой сортировки, но противоречия здесь нет, поскольку интросорт — это гибридный алгоритм сортировки, в котором для небольшого количества элементов используется сортировка вставками, а позже применяется более быстрый алгоритм: быстрая сортировка или пирамидальная сортировка.



Вопрос 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. Так писать нельзя: будет синтаксическая ошибка «Синтаксическая ошибка: ключевое слово static использовано в неправильном контексте»
  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. На каждой итерации выводится «a» + предупреждение.

  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 значение «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. 1 2 3 32332 The end



  2. 1 2 3 The end



  3. The end



  4. 32332 The end

Правильный ответ 3.

The end

Объяснение На первый взгляд может показаться, что функция не возвращает генератор, поскольку выражение доходности недостижимо.

Однако любая функция содержащий Выражение доходности автоматически становится функцией-генератором.

В оригинальном RFC было так написано .

В момент первой итерации генератор начинает выполнение кода функции с самого начала до первого доступного выражения доходности, но поскольку его нет, генератор завершает свою работу, не передавая в цикл никаких данных.



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

Ответы на вопросы опубликуем в обновлении поста в среду, 4 июля.

.

Если решитесь, поместите ответы под спойлер, чтобы не портить удовольствие другим.

И не забудьте зайти в личный кабинет Хабра после окончания викторины.

Наслаждаться! Теги: #php #викторина #программирование #Ненормальное программирование #php #Развлекательные задачи #Образовательный процесс в IT

Вместе с данным постом часто просматривают: