Quiz do PHP de sexta-feira: algumas aventuras do programador Brad, uma sequência estranha e prêmios

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 PHP

Vencedor


egor_nullptr

Vencedores


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 Record


Bô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:

  1. Matriz (1, 2, 3)
  2. Matriz (1, 2, 2)
  3. Matriz (3, 2, 1)
  4. Erro

Resposta correta
Matriz (1, 2, 2)

Explicação
Como 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:

  1.   0 => flour 1 => wheat 

  2.   0 => wheat 1 => flour 2 => cupcake 

  3.  0 => flour 1 => wheat cupcake 

  4.  cupcake 



Resposta correta
4)
 0 => flour 1 => wheat cupcake 



Explicação
Sem 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:

  1. Sim, a classe Foo deve implementar a interface Traversable
  2. Sim, a classe Foo deve implementar métodos de interface ArrayAccess
  3. Não, haverá um erro, o argumento do operador ...- deve ser uma matriz

Resposta correta
1. Sim, a classe Foo deve implementar a interface Traversable

Explicação
Tudo é 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:

  1. fusão não recursiva
  2. heapsort (variação do Edsger Dijkstra smoothsort)
  3. quicksort mediana de três
  4. introsort

Resposta correta
4. introsort

Explicação
Usado 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:

  1. Em um caso, a palavra-chave static :) é usada, mas não afeta
  2. O resultado de getLambda2 () não pode ser vinculado a nenhum objeto
  3. Portanto, você não pode escrever: haverá um erro de sintaxe "Erro de sintaxe: palavra-chave estática usada no contexto errado"
  4. O fechamento de getLamda2 () pode apenas ligar (bindTo) a classes

Resposta correta
2. O resultado de getLambda2 () não pode ser vinculado a nenhum objeto

Explicação
O 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:

  1.  bool(false) bool(false) 
  2.  bool(false) bool(true) 
  3.  bool(true) bool(true) 
  4.  bool(true) bool(false) 

Resposta correta
4)
 bool(true) bool(false) 


Explicação
A 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:

  1. Serão exibidos dígitos de 0 a 39, bem como Aviso: Um valor não numérico encontrado em cada iteração
  2. Cada iteração produzirá 'a' + Aviso
  3. 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 correta
3. 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ção
Nem 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.  1 2 3 32332 The end 

  2.  1 2 3 The end 

  3.  The end 

  4.  32332 The end 


Resposta correta
3)
 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!

Source: https://habr.com/ru/post/pt414481/


All Articles