Prueba PHP del viernes: algunas aventuras del programador Brad, una secuencia extraña y premios

Hola Prometimos, lo hacemos: continuamos la serie de mini-cuestionarios dedicados a diferentes lenguajes de programación en nuestro blog (anterior: 1 (para conocimiento de Python, PHP, Golang y DevOps) , 2 (completamente en marcha ) ). El lanzamiento de hoy está dedicado a PHP.

Debajo del corte: ocho preguntas, algunas aventuras del programador Brad, una secuencia extraña y una mercha genial como premios. La prueba se extiende hasta el 4 de julio.

UPD 2: según lo acordado, publicamos el análisis de las tareas de prueba. Las explicaciones se ocultaron debajo del spoiler después de las respuestas correctas. Si aún tiene preguntas, hágalas en los comentarios.

UPD: Hemos terminado de aceptar respuestas. ¡Gracias a todos los que participaron! Estamos preparando una revisión de tareas. Las respuestas a ellas están dentro del texto, y los ganadores y los ganadores de los premios están debajo del spoiler.
Ganadores y ganadores del concurso PHP.

Ganador


egor_nullptr

Galardonados


Seleccionamos al azar a los diez mejores participantes que cometieron no más de dos errores en las respuestas: Dimd13 , slimus , alexchromets , Donquih0te , TexElless , SamDark , AdmAlexus , voiceofnoise , Raz-Mik , Serj_By .

Draw Record


Bonus!


Para aquellos que cometieron un solo error, adicionalmente les damos los huesos holivny con los que pueden decidir en qué idioma de backend y marco frontend para escribir su nuevo proyecto o rehacer el anterior. Son recibidos: DjSebas , TexElless , Turik-us , offlinewan , voiceofnoise y andrey_96 , delight- almighty .




Reglas del juego


Enviaremos el kit de recuerdos de Avito a la primera persona que los responda correctamente: una camiseta con un elefante php, calcetines y holivones (puede adivinar en qué lenguaje de fondo y marco frontend se escribirá su nuevo proyecto).

Enviaremos calcetines Avito a otras diez personas que respondieron correctamente . Juguemos con la ayuda de un aleatorizador. Él determinará quién irá dos camisetas más y un conjunto de huesos.



Preguntas y opciones de respuesta


Pregunta 1


Lo que generará el código:

<?php $a = [1, 2, 3]; foreach($a as &$value) {} foreach($a as $value) {} print_r($a); 

Opciones de respuesta:

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

Respuesta correcta
Matriz (1, 2, 2)

Explicación
Dado que en php las variables creadas en el bucle permanecen vivas después de su finalización, al comienzo del segundo bucle la variable $ value es una referencia al último elemento de la matriz. Durante la iteración del último foreach, los valores de la matriz se escriben en su último elemento (ya que $ value es una referencia). Esto se verá como una matriz en cada iteración del segundo bucle:
1. [1, 2, 1]
2. [1, 2, 2]
3. [1, 2, 2]

Pregunta 2


Lo que generará el código:

 <?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(); 

Opciones de respuesta:

  1.   0 => flour 1 => wheat 

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

  3.  0 => flour 1 => wheat cupcake 

  4.  cupcake 



Respuesta correcta
4)
 0 => flour 1 => wheat cupcake 



Explicación
No hay comentarios Solo un pequeño ejemplo complicado con generadores.

Pregunta 3


Una vez, el programador Brad decidió portar una biblioteca de Go to PHP para recolectar estrellas en GitHub, y se preguntó:

¿Es posible la siguiente construcción?

 <?php print_r(...(new Foo())); 

Opciones de respuesta:

  1. Sí, la clase Foo debe implementar la interfaz Traversable
  2. Sí, la clase Foo debe implementar métodos de interfaz ArrayAccess
  3. No, habrá un error, el argumento de ...- el operador debe ser una matriz

Respuesta correcta
1. Sí, la clase Foo debe implementar la interfaz Traversable

Explicación
Todo es simple aquí. De la documentación de desempaquetado de argumentos:
Las matrices y los objetos que implementan la interfaz Traversable se pueden desempaquetar en una lista de argumentos cuando se pasan a una función utilizando el operador ...


Pregunta 4


¿Qué algoritmo de clasificación se usa en el corazón de PHP para funciones como ordenar, etc.?

Opciones de respuesta:

  1. fusión no recursiva
  2. heapsort (variación del Edsger Dijkstra smoothsort)
  3. clasificación rápida de tres
  4. introducción

Respuesta correcta
4. introsort

Explicación
Usado por introsort. El código fuente se puede ver en Github . La documentación menciona el uso de quicksort, pero no hay contradicción aquí, porque introsort es un algoritmo de clasificación híbrido, donde la clasificación por inserción se usa para un pequeño número de elementos, y luego se usa un algoritmo más rápido: quicksort o heapsort.


Pregunta 5


Hay un 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)); }; } } 

Pregunta: ¿hay alguna diferencia entre los valores de retorno getLambda y getLambda2?

Opciones de respuesta:

  1. En un caso, se usa la palabra clave static :), pero no afecta
  2. El resultado de getLambda2 () no puede vincularse a ningún objeto
  3. Por lo tanto, no puede escribir: habrá un error de sintaxis "Error de sintaxis: palabra clave estática utilizada en un contexto incorrecto"
  4. El cierre de getLamda2 () solo puede enlazar (bindTo) a clases

Respuesta correcta
2. El resultado de getLambda2 () no puede vincularse a ningún objeto

Explicación
El método getLambda2 () devuelve una función anónima estática que no puede vincularse a un objeto a través del método -> bindTo (). Su uso es raro en el código, pero aún así

Pregunta 6


Lo que generará el código:

 <?php $a = true; $b = false; $c = $a and $b; $d = $a && $b; var_dump($c); var_dump($d); 

Opciones de respuesta:

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

Respuesta correcta
4)
 bool(true) bool(false) 


Explicación
La diferencia entre && y y en prioridad. La expresión $ d = $ a && $ b funciona como $ d = ($ a && $ b). Pero la expresión $ c = $ a y $ b funciona de manera diferente y se puede representar como (($ c = $ a) y $ b).

Pregunta 7


Lo que generará el código:

 <?php $a = 'a'; for ($i = 0; $i < 40; $i++) { echo $a++, PHP_EOL; } 

Opciones de respuesta:

  1. Se mostrarán dígitos del 0 al 39, así como Advertencia: un valor no numérico encontrado en cada iteración
  2. Cada iteración generará 'a' + Advertencia
  3. Secuencia extrañ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 

Respuesta correcta
3. Secuencia extrañ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 


Explicación
No todos lo saben, pero el operador de incremento se puede aplicar a los personajes. De la documentación:
PHP sigue las convenciones de Perl (en oposición a C) con respecto a las operaciones aritméticas con variables de caracteres. Por ejemplo, en PHP y Perl $ a = 'Z'; $ a ++; establecerá $ a en 'AA', mientras que en C a = 'Z'; a ++; asigna un valor a '[' (el valor ASCII de 'Z' es 90 y el valor ASCII de '[' es 91).


Pregunta 8


Lo que generará el código:

 <?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; 

Opciones de respuesta:

  1.  1 2 3 32332 The end 

  2.  1 2 3 The end 

  3.  The end 

  4.  32332 The end 


Respuesta correcta
3)
 The end 



Explicación
A primera vista, puede parecer que la función no devuelve un generador, porque la expresión de rendimiento es inalcanzable. Sin embargo, cualquier función que contenga una expresión de rendimiento se convierte automáticamente en una función generadora. El RFC original lo dice . En el momento de la primera iteración, el generador comienza a ejecutar el código de función desde el principio hasta la primera expresión de rendimiento disponible, pero como no está allí, el generador termina su trabajo sin transferir ningún dato al bucle.

Resumen


Publicaremos las respuestas a las preguntas mediante una actualización de la publicación el miércoles 4 de julio . Si decides, pon las respuestas debajo del spoiler para no estropear la diversión de los demás. Y no olvide verificar la cuenta de Habr después del final del cuestionario.

¡A disfrutar!

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


All Articles