Hallo! Wir haben versprochen - wir tun es: Wir setzen die Reihe von Mini-Quiz fort, die verschiedenen Programmiersprachen in unserem Blog gewidmet sind (vorher:
1 (für Kenntnisse in Python, PHP, Golang und DevOps) ,
2 (komplett unterwegs ) ). Die heutige Version ist PHP gewidmet.
Unter dem Schnitt - acht Fragen, einige Abenteuer des Programmierers Brad, eine seltsame Sequenz und ein cooler Merch als Preis. Das Quiz läuft bis zum 4. Juli.
UPD 2: Wie vereinbart veröffentlichen wir eine Analyse der Quizaufgaben. Erklärungen wurden nach den richtigen Antworten unter dem Spoiler versteckt. Wenn Sie noch Fragen haben, stellen Sie diese in den Kommentaren.
UPD: Wir haben die Antworten akzeptiert. Vielen Dank an alle, die teilgenommen haben! Wir bereiten eine Überprüfung der Aufgaben vor. Die Antworten darauf befinden sich im Text, und die Gewinner und Preisträger stehen unter dem Spoiler.
Gewinner und Preisträger des PHP-QuizGewinner
egor_nullptrPreisträger
Wir haben zufällig die zehn besten Teilnehmer ausgewählt, die nicht mehr als zwei Fehler in den Antworten gemacht haben:
Dimd13 ,
Slimus ,
Alexchromets ,
Donquih0te ,
TexElless ,
SamDark ,
AdmAlexus ,
Voiceofnoise ,
Raz-Mik ,
Serj_By .
Rekord zeichnenBonus!
Für diejenigen, die nur einen Fehler gemacht haben, geben wir zusätzlich heilige Knochen, mit denen Sie entscheiden können, in welcher Backend-Sprache und in welchem Frontend-Framework Sie Ihr neues Projekt schreiben oder das alte neu erstellen möchten. Sie werden empfangen:
DjSebas ,
TexElless ,
Turik-us ,
offlinewan ,
voiceofnoise und
andrey_96 ,
allmächtig .

Spielregel
Wir senden das Avito-Souvenir-Kit an die
erste Person, die es richtig beantwortet: ein T-Shirt mit einem PHP-Elefanten, Socken und Holivones (Sie können sich vorstellen, in welcher Backend-Sprache und in welchem Frontend-Framework Ihr neues Projekt geschrieben wird).
Wir werden Avito-Socken an
zehn andere senden
, die richtig geantwortet haben . Spielen wir mit Hilfe eines Randomizers. Er wird bestimmen, wer noch zwei T-Shirts und einen Satz Knochen tragen wird.

Fragen und Antwortmöglichkeiten
Frage 1
Was der Code ausgibt:
<?php $a = [1, 2, 3]; foreach($a as &$value) {} foreach($a as $value) {} print_r($a);
Antwortoptionen:- Array (1, 2, 3)
- Array (1, 2, 2)
- Array (3, 2, 1)
- Fehler
Richtige AntwortArray (1, 2, 2)
ErklärungDa in PHP die in der Schleife erstellten Variablen nach ihrer Fertigstellung am Leben bleiben, ist die Variable $ value zu Beginn der zweiten Schleife eine Referenz auf das letzte Element des Arrays. Während der Iteration des letzten foreach werden Werte aus dem Array in das letzte Element geschrieben (da $ value eine Referenz ist). Dies sieht bei jeder Iteration der zweiten Schleife wie ein Array aus:
1. [1, 2, 1]
2. [1, 2, 2]
3. [1, 2, 2]
Frage 2
Was der Code ausgibt:
<?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();
Antwortoptionen: 0 => flour 1 => wheat
0 => wheat 1 => flour 2 => cupcake
0 => flour 1 => wheat cupcake
cupcake
Richtige Antwort4.
0 => flour 1 => wheat cupcake
ErklärungKeine Kommentare. Nur ein kleines kniffliges Beispiel mit Generatoren.
Frage 3
Einmal beschloss der Programmierer Brad, eine Bibliothek von Go to PHP zu portieren, um Sterne auf GitHub zu sammeln, und fragte sich:
Ist folgende Konstruktion möglich?
<?php print_r(...(new Foo()));
Antwortoptionen:- Ja, die Foo-Klasse muss die Traversable-Schnittstelle implementieren
- Ja, die Foo-Klasse muss ArrayAccess-Schnittstellenmethoden implementieren
- Nein, es wird ein Fehler auftreten. Das Argument des Operators ... muss ein Array sein
Richtige Antwort1. Ja, die Foo-Klasse muss die Traversable-Schnittstelle implementieren
ErklärungHier ist alles einfach. Aus der
Dokumentation zum Auspacken von Argumenten:
Arrays und Objekte, die die Traversable-Schnittstelle implementieren, können in eine Argumentliste entpackt werden, wenn sie mit dem Operator an eine Funktion übergeben werden ...
Frage 4
Welcher Sortieralgorithmus wird im Herzen von PHP für Funktionen wie Sortieren usw. verwendet?
Antwortoptionen:- nicht rekursives Mergesort
- Heapsort (Variation des Edsger Dijkstra Smoothsort)
- Quicksort Median von drei
- introsort
Richtige Antwort4. introsort
ErklärungWird von Introsort verwendet. Der Quellcode kann auf
Github angezeigt werden. In der Dokumentation wird die Verwendung von Quicksort erwähnt, aber hier besteht kein Widerspruch, da Introsort ein hybrider Sortieralgorithmus ist, bei dem die Einfügungssortierung für eine kleine Anzahl von Elementen verwendet wird und später ein schnellerer Algorithmus verwendet wird: Quicksort oder Heapsort.
Frage 5
Es gibt einen 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)); }; } }
Frage: Gibt es einen Unterschied zwischen den Rückgabewerten getLambda und getLambda2?
Antwortoptionen:- In einem Fall wird das Schlüsselwort static :) verwendet, dies hat jedoch keine Auswirkungen
- Das Ergebnis von getLambda2 () kann nicht an ein Objekt gebunden werden
- Sie können also nicht schreiben: Es wird ein Syntaxfehler "Syntaxfehler: statisches Schlüsselwort im falschen Kontext verwendet" angezeigt.
- Das Schließen von getLamda2 () kann nur an Klassen binden (bindTo)
Richtige Antwort2. Das Ergebnis von getLambda2 () kann nicht an ein Objekt gebunden werden
ErklärungDie Methode getLambda2 () gibt eine statische anonyme Funktion zurück, die über die Methode -> bindTo () nicht an ein Objekt gebunden werden kann. Ihre Verwendung ist im Code selten, aber immer noch
Frage 6
Was der Code ausgibt:
<?php $a = true; $b = false; $c = $a and $b; $d = $a && $b; var_dump($c); var_dump($d);
Antwortoptionen: bool(false) bool(false)
bool(false) bool(true)
bool(true) bool(true)
bool(true) bool(false)
Richtige Antwort4.
bool(true) bool(false)
ErklärungDer Unterschied zwischen && und und in der Priorität. Der Ausdruck $ d = $ a && $ b funktioniert wie $ d = ($ a && $ b). Der Ausdruck $ c = $ a und $ b funktioniert jedoch unterschiedlich und kann als (($ c = $ a) und $ b) dargestellt werden.
Frage 7
Was der Code ausgibt:
<?php $a = 'a'; for ($i = 0; $i < 40; $i++) { echo $a++, PHP_EOL; }
Antwortoptionen:- Es werden Ziffern von 0 bis 39 sowie Warnung angezeigt: Ein nicht numerischer Wert, der bei jeder Iteration auftritt
- Jede Iteration gibt 'a' + Warnung aus
- Seltsame Reihenfolge:
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
Richtige Antwort3. Seltsame Reihenfolge:
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
ErklärungNicht jeder weiß es, aber der Inkrementoperator kann auf Zeichen angewendet werden. Aus der Dokumentation:
PHP folgt Perl-Konventionen (im Gegensatz zu C) in Bezug auf arithmetische Operationen mit Zeichenvariablen. Zum Beispiel in PHP und Perl $ a = 'Z'; $ a ++; setzt $ a auf 'AA', während in C a = 'Z'; a ++; weist '[' einen Wert zu (der ASCII-Wert von 'Z' ist 90 und der ASCII-Wert von '[' ist 91).
Frage 8
Was der Code ausgibt:
<?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;
Antwortoptionen: 1 2 3 32332 The end
1 2 3 The end
The end
32332 The end
ErklärungAuf den ersten Blick scheint es, dass die Funktion keinen Generator zurückgibt, da der Ertragsausdruck nicht erreichbar ist. Jede Funktion,
die einen Ertragsausdruck enthält, wird jedoch automatisch zu einer Generatorfunktion. Der ursprüngliche RFC
sagt es. Zum Zeitpunkt der ersten Iteration beginnt der Generator, den Funktionscode von Anfang an bis zum ersten verfügbaren Ertragsausdruck auszuführen. Da er jedoch nicht vorhanden ist, beendet der Generator seine Arbeit, ohne Daten in die Schleife zu übertragen.
Zusammenfassung
Wir werden Antworten auf Fragen per Update am Mittwoch, den 4. Juli, veröffentlichen . Wenn Sie sich entscheiden - legen Sie die Antworten unter den Spoiler, um den Spaß anderer nicht zu verderben. Und vergessen Sie nicht, nach dem Ende des Quiz das Konto des Habr zu überprüfen.
Viel Spaß!