Le quiz PHP de vendredi: quelques aventures du programmeur Brad, une séquence étrange et des prix

Salut Nous avons promis - nous le faisons: nous continuons la série de mini-quiz dédiés aux différents langages de programmation dans notre blog (précédent: 1 (pour la connaissance de Python, PHP, Golang et DevOps) , 2 (complètement sur Go) ). La version d'aujourd'hui est dédiée à PHP.

Sous la coupe - huit questions, quelques aventures du programmeur Brad, une séquence étrange et un merch cool comme prix. Le quiz se déroule jusqu'au 4 juillet.

UPD 2: Comme convenu, nous publions une analyse des tâches du quiz. Des explications étaient cachées sous le spoiler après les bonnes réponses. Si vous avez encore des questions, posez-les dans les commentaires.

UPD: Nous avons fini d'accepter les réponses. Merci à tous ceux qui ont participé! Nous préparons un examen des tâches. Les réponses à ces questions se trouvent dans le texte, et les gagnants et les lauréats sont sous le spoiler.
Gagnants et lauréats du quiz PHP

Gagnant


egor_nullptr

Lauréats


Nous avons sélectionné au hasard les dix meilleurs participants qui n'ont pas fait plus de deux erreurs dans les réponses: Dimd13 , slimus , alexchromets , Donquih0te , TexElless , SamDark , AdmAlexus , voiceofnoise , Raz-Mik , Serj_By .

Draw Record


Bonus!


Pour ceux qui n'ont commis qu'une seule erreur, nous fournissons également des ossements holivny avec lesquels vous pouvez décider dans quel langage backend et framework frontend pour écrire votre nouveau projet / ou refaire l'ancien. Ils sont reçus: DjSebas , TexElless , Turik-us , offlinewan , voiceofnoise , andrey_96 , délice-tout-puissant .




Règles du jeu


Nous enverrons le kit souvenir Avito au premier qui y répondra correctement: un t-shirt avec un éléphant php, des chaussettes et des os holivaires (il sera possible de deviner dans quel langage backend et framework frontend votre nouveau projet sera écrit).

Nous enverrons des chaussettes Avito à dix autres personnes qui ont répondu correctement . Jouons à l'aide d'un randomiseur. Il déterminera qui ira deux autres t-shirts et un ensemble d'os.



Questions et réponses


Question 1


Ce que le code affichera:

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

Options de réponse:

  1. Tableau (1, 2, 3)
  2. Tableau (1, 2, 2)
  3. Tableau (3, 2, 1)
  4. Erreur

Bonne réponse
Tableau (1, 2, 2)

Explication
Étant donné qu'en php les variables créées dans la boucle restent actives après son achèvement, au début de la deuxième boucle la variable $ value est une référence au dernier élément du tableau. Lors de l'itération de la dernière foreach, les valeurs du tableau sont écrites dans son dernier élément (puisque $ value est une référence). Cela ressemblera à un tableau à chaque itération de la deuxième boucle:
1. [1, 2, 1]
2. [1, 2, 2]
3. [1, 2, 2]

Question 2


Ce que le code affichera:

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

Options de réponse:

  1.   0 => flour 1 => wheat 

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

  3.  0 => flour 1 => wheat cupcake 

  4.  cupcake 



Bonne réponse
4.
 0 => flour 1 => wheat cupcake 



Explication
Pas de commentaires. Juste un petit exemple délicat avec des générateurs.

Question 3


Une fois, le programmeur Brad a décidé de porter une bibliothèque de Go vers PHP pour collecter des étoiles sur GitHub, et s'est demandé:

La construction suivante est-elle possible?

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

Options de réponse:

  1. Oui, la classe Foo doit implémenter l'interface Traversable
  2. Oui, la classe Foo doit implémenter les méthodes d'interface ArrayAccess
  3. Non, il y aura une erreur, l'argument de l'opérateur ...- doit être un tableau

Bonne réponse
1. Oui, la classe Foo doit implémenter l'interface Traversable

Explication
Ici, tout est simple. Dans la documentation d' Argument Unpacking:
Les tableaux et les objets qui implémentent l'interface Traversable peuvent être décompressés dans une liste d'arguments lorsqu'ils sont passés à une fonction à l'aide de l'opérateur ...


Question 4


Quel algorithme de tri est utilisé au cœur de PHP pour des fonctions comme le tri, etc.?

Options de réponse:

  1. fusion non récursive
  2. heapsort (variation du smoothsort Edsger Dijkstra)
  3. tri rapide médiane de trois
  4. introsort

Bonne réponse
4. introsort

Explication
Utilisé par introsort. Le code source peut être consulté sur Github . La documentation mentionne l'utilisation de quicksort, mais il n'y a pas de contradiction ici, car introsort est un algorithme de tri hybride, où le tri par insertion est utilisé pour un petit nombre d'éléments, et plus tard un algorithme plus rapide est utilisé: quicksort ou heapsort.


Question 5


Il y a un code:

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

Question: existe-t-il une différence entre les valeurs de retour getLambda et getLambda2?

Options de réponse:

  1. Dans un cas, le mot clé static :) est utilisé, mais il n'affecte pas
  2. Le résultat de getLambda2 () ne peut être lié à aucun objet
  3. Vous ne pouvez donc pas écrire: il y aura une erreur de syntaxe "Erreur de syntaxe: mot clé statique utilisé dans un mauvais contexte"
  4. La fermeture de getLamda2 () ne peut que lier (bindTo) aux classes

Bonne réponse
2. Le résultat de getLambda2 () ne peut être lié à aucun objet

Explication
La méthode getLambda2 () renvoie une fonction anonyme statique qui ne peut pas être liée à un objet via la méthode -> bindTo (). Leur utilisation est rare dans le code, mais reste

Question 6


Ce que le code affichera:

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

Options de réponse:

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

Bonne réponse
4.
 bool(true) bool(false) 


Explication
La différence entre && et et en priorité. L'expression $ d = $ a && $ b fonctionne comme $ d = ($ a && $ b). Mais l'expression $ c = $ a et $ b fonctionne différemment et peut être représentée comme (($ c = $ a) et $ b).

Question 7


Ce que le code affichera:

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

Options de réponse:

  1. Les chiffres de 0 à 39 seront affichés, ainsi que Avertissement: Une valeur non numérique rencontrée dans à chaque itération
  2. Chaque itération affichera «a» + Avertissement
  3. Séquence étrange:
     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 

Bonne réponse
3. Séquence étrange:
 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 


Explication
Tout le monde ne le sait pas, mais l'opérateur d'incrémentation peut être appliqué aux caractères. De la documentation:
PHP suit les conventions Perl (par opposition à C) concernant les opérations arithmétiques avec des variables de caractères. Par exemple, en PHP et Perl $ a = 'Z'; $ a ++; fixera $ a à 'AA', tandis qu'en C a = 'Z'; a ++; attribue une valeur à «[» (la valeur ASCII de «Z» est 90 et la valeur ASCII de «[» est 91).


Question 8


Ce que le code affichera:

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

Options de réponse:

  1.  1 2 3 32332 The end 

  2.  1 2 3 The end 

  3.  The end 

  4.  32332 The end 


Bonne réponse
3.
 The end 



Explication
À première vue, il peut sembler que la fonction ne renvoie pas de générateur, car l'expression de rendement est inaccessible. Cependant, toute fonction contenant une expression de rendement devient automatiquement une fonction de générateur. Le RFC d'origine le dit . Au moment de la première itération, le générateur commence à exécuter le code de fonction du tout début à la première expression de rendement disponible, mais comme il n'y est pas, le générateur termine son travail sans transférer de données dans la boucle.

Résumé


Nous publierons les réponses aux questions par mise à jour de l'article le mercredi 4 juillet . Si vous décidez - mettez les réponses sous le spoiler afin de ne pas gâcher le plaisir des autres. Et n'oubliez pas de vérifier le compte Habr après la fin du quiz.

Profitez-en!

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


All Articles