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!