Oi Prometemos - fazemos: continuamos a série de mini-questionários dedicados a diferentes linguagens de programação em nosso blog (anterior: 
1 (para conhecimento de Python, PHP, Golang e DevOps) , 
2 (completamente em andamento ) ). O lançamento de hoje é dedicado ao PHP.
Sob o corte - oito perguntas, algumas aventuras do programador Brad, uma sequência estranha e uma merch cool como prêmios. O teste dura até 4 de julho.
UPD 2: Conforme combinado, publicamos a análise das tarefas do questionário. As explicações foram escondidas sob o spoiler após as respostas corretas. Se você ainda tiver dúvidas, pergunte-as nos comentários.
UPD: Terminamos de aceitar as respostas. Obrigado a todos que participaram! Estamos preparando uma revisão de tarefas. As respostas para eles estão dentro do texto, e os vencedores e vencedores dos prêmios estão sob o spoiler.
Vencedores e vencedores do Quiz PHPVencedor
egor_nullptrVencedores
Selecionamos aleatoriamente os dez melhores participantes que não cometeram mais que dois erros nas respostas: 
Dimd13 , 
slimus , 
alexchromets , 
Donquih0te , 
TexElless , 
SamDark , 
AdmAlexus , 
voiceofnoise , 
Raz-Mik , 
Serj_By .
Draw RecordBônus!
Para aqueles que cometeram apenas um erro, adicionalmente damos holivny ossos com os quais você pode decidir em qual linguagem de back-end e estrutura de front-end deve escrever seu novo projeto / ou refazer o antigo. Eles são recebidos: 
DjSebas , 
TexElless , 
Turik-us , 
offlinewan , 
voiceofnoise , 
andrey_96 , 
prazer todo-poderoso .
 
Regras do jogo
Enviaremos o kit de lembranças Avito para o 
primeiro a respondê-las corretamente: uma camiseta com um elefante php, meias e ossos holivares (será possível adivinhar em qual linguagem de back-end e estrutura de front-end seu novo projeto será escrito).
Enviaremos meias Avito para 
outras dez pessoas que responderam corretamente . Vamos jogar com a ajuda de um randomizador. Ele determinará quem usará mais duas camisetas e um conjunto de ossos.

Opções de perguntas e respostas
Pergunta 1
Qual será o código de saída:
<?php $a = [1, 2, 3]; foreach($a as &$value) {} foreach($a as $value) {} print_r($a); 
Opções de resposta:- Matriz (1, 2, 3)
- Matriz (1, 2, 2)
- Matriz (3, 2, 1)
- Erro
Resposta corretaMatriz (1, 2, 2)
 ExplicaçãoComo no php as variáveis criadas no loop permanecem ativas após sua conclusão, no início do segundo loop, a variável $ value é uma referência ao último elemento do array. Durante a iteração da última pesquisa, os valores da matriz são gravados no último elemento (já que $ value é uma referência). Isso parecerá uma matriz a cada iteração do segundo loop:
1. [1, 2, 1]
2. [1, 2, 2]
3. [1, 2, 2]
 Questão 2
Qual será o código de saída:
 <?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(); 
Opções de resposta:-  -  0 => flour 1 => wheat
 
 
-  -  0 => wheat 1 => flour 2 => cupcake
 
 
-  - 0 => flour 1 => wheat cupcake
 
 
-  - cupcake
 
 
Resposta correta4)
 0 => flour 1 => wheat cupcake 
 ExplicaçãoSem comentários. Apenas um pequeno exemplo complicado com geradores.
 Pergunta 3
Uma vez, o programador Brad decidiu portar uma biblioteca de Go para PHP para coletar estrelas no GitHub, e se perguntou:
É possível a seguinte construção?
 <?php print_r(...(new Foo())); 
Opções de resposta:- Sim, a classe Foo deve implementar a interface Traversable
- Sim, a classe Foo deve implementar métodos de interface ArrayAccess
- Não, haverá um erro, o argumento do operador ...- deve ser uma matriz
Resposta correta1. Sim, a classe Foo deve implementar a interface Traversable
 ExplicaçãoTudo é simples aqui. Na 
documentação Descompactar argumento:
Matrizes e objetos que implementam a interface Traversable podem ser descompactados em uma lista de argumentos quando passados para uma função usando o operador ...
 Pergunta 4
Que algoritmo de classificação é usado no coração do PHP para funções como classificação, etc.?
Opções de resposta:- fusão não recursiva
- heapsort (variação do Edsger Dijkstra smoothsort)
- quicksort mediana de três
- introsort
Resposta correta4. introsort
 ExplicaçãoUsado pelo introsort. O código fonte pode ser visualizado no 
Github . A documentação menciona o uso do quicksort, mas não há contradição aqui, porque o introsort é um algoritmo de classificação híbrido, em que a classificação por inserção é usada para um pequeno número de elementos e, posteriormente, um algoritmo mais rápido é usado: quicksort ou heapsort.
 Questão 5
Existe um código:
 <?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)); }; } } 
Pergunta: existe uma diferença entre os valores de retorno getLambda e getLambda2?
Opções de resposta:- Em um caso, a palavra-chave static :) é usada, mas não afeta
- O resultado de getLambda2 () não pode ser vinculado a nenhum objeto
- Portanto, você não pode escrever: haverá um erro de sintaxe "Erro de sintaxe: palavra-chave estática usada no contexto errado"
- O fechamento de getLamda2 () pode apenas ligar (bindTo) a classes
Resposta correta2. O resultado de getLambda2 () não pode ser vinculado a nenhum objeto
 ExplicaçãoO método getLambda2 () retorna uma função anônima estática que não pode ser vinculada a um objeto por meio do método -> bindTo (). Seu uso é raro no código, mas ainda
 Pergunta 6
Qual será o código de saída:
 <?php $a = true; $b = false; $c = $a and $b; $d = $a && $b; var_dump($c); var_dump($d); 
Opções de resposta:-  - bool(false) bool(false)
 
-  - bool(false) bool(true)
 
-  - bool(true) bool(true)
 
-  - bool(true) bool(false)
 
Resposta correta4)
 bool(true) bool(false) 
 ExplicaçãoA diferença entre && e e em prioridade. A expressão $ d = $ a && $ b funciona como $ d = ($ a && $ b). Mas a expressão $ c = $ a e $ b funciona de maneira diferente e pode ser representada como (($ c = $ a) e $ b).
 Pergunta 7
Qual será o código de saída:
 <?php $a = 'a'; for ($i = 0; $i < 40; $i++) { echo $a++, PHP_EOL; } 
Opções de resposta:- Serão exibidos dígitos de 0 a 39, bem como Aviso: Um valor não numérico encontrado em cada iteração
- Cada iteração produzirá 'a' + Aviso
- Sequência estranha: 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
 
Resposta correta3. Sequência estranha:
 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 
 ExplicaçãoNem todo mundo sabe, mas o operador de incremento pode ser aplicado aos caracteres. A partir da documentação:
O PHP segue as convenções Perl (em oposição a C) sobre operações aritméticas com variáveis de caracteres. Por exemplo, no PHP e Perl $ a = 'Z'; $ a ++; definirá $ a como 'AA', enquanto em C a = 'Z'; a ++; atribui um valor a '[' (o valor ASCII de 'Z' é 90 e o valor ASCII de '[' é 91).
 Pergunta 8
Qual será o código de saída:
 <?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; 
Opções de resposta:-  - 1 2 3 32332 The end
 
 
-  - 1 2 3 The end
 
 
-  - The end
 
 
-  - 32332 The end
 
 
ExplicaçãoÀ primeira vista, pode parecer que a função não retorne um gerador, porque a expressão de rendimento está inacessível. No entanto, qualquer função que 
contenha uma expressão de rendimento se torna automaticamente uma função geradora. A RFC original 
diz isso. No momento da primeira iteração, o gerador começa a executar o código de função desde o início até a primeira expressão de rendimento disponível, mas como não existe, o gerador termina seu trabalho sem transferir nenhum dado para o loop.
 Sumário
Postaremos respostas para as perguntas atualizando na quarta-feira, 4 de julho . Se você decidir - coloque as respostas embaixo do spoiler para não estragar a diversão dos outros. E não se esqueça de verificar a conta do Habr após o final do teste.
Aproveite!