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 PHPGagnant
egor_nullptrLauré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 RecordBonus!
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:- Tableau (1, 2, 3)
- Tableau (1, 2, 2)
- Tableau (3, 2, 1)
- Erreur
Bonne réponseTableau (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: 0 => flour 1 => wheat
0 => wheat 1 => flour 2 => cupcake
0 => flour 1 => wheat cupcake
cupcake
Bonne réponse4.
0 => flour 1 => wheat cupcake
ExplicationPas 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:- Oui, la classe Foo doit implémenter l'interface Traversable
- Oui, la classe Foo doit implémenter les méthodes d'interface ArrayAccess
- Non, il y aura une erreur, l'argument de l'opérateur ...- doit être un tableau
Bonne réponse1. Oui, la classe Foo doit implémenter l'interface Traversable
ExplicationIci, 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:- fusion non récursive
- heapsort (variation du smoothsort Edsger Dijkstra)
- tri rapide médiane de trois
- introsort
Bonne réponse4. introsort
ExplicationUtilisé 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:- Dans un cas, le mot clé static :) est utilisé, mais il n'affecte pas
- Le résultat de getLambda2 () ne peut être lié à aucun objet
- Vous ne pouvez donc pas écrire: il y aura une erreur de syntaxe "Erreur de syntaxe: mot clé statique utilisé dans un mauvais contexte"
- La fermeture de getLamda2 () ne peut que lier (bindTo) aux classes
Bonne réponse2. Le résultat de getLambda2 () ne peut être lié à aucun objet
ExplicationLa 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: bool(false) bool(false)
bool(false) bool(true)
bool(true) bool(true)
bool(true) bool(false)
Bonne réponse4.
bool(true) bool(false)
ExplicationLa 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:- Les chiffres de 0 à 39 seront affichés, ainsi que Avertissement: Une valeur non numérique rencontrée dans à chaque itération
- Chaque itération affichera «a» + Avertissement
- 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éponse3. 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
ExplicationTout 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 2 3 32332 The end
1 2 3 The end
The end
32332 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!