Das PHP-Quiz am Freitag: einige Abenteuer des Programmierers Brad, eine seltsame Sequenz und Preise

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-Quiz

Gewinner


egor_nullptr

Preisträ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 zeichnen


Bonus!


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:

  1. Array (1, 2, 3)
  2. Array (1, 2, 2)
  3. Array (3, 2, 1)
  4. Fehler

Richtige Antwort
Array (1, 2, 2)

Erklärung
Da 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:

  1.   0 => flour 1 => wheat 

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

  3.  0 => flour 1 => wheat cupcake 

  4.  cupcake 



Richtige Antwort
4.
 0 => flour 1 => wheat cupcake 



Erklärung
Keine 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:

  1. Ja, die Foo-Klasse muss die Traversable-Schnittstelle implementieren
  2. Ja, die Foo-Klasse muss ArrayAccess-Schnittstellenmethoden implementieren
  3. Nein, es wird ein Fehler auftreten. Das Argument des Operators ... muss ein Array sein

Richtige Antwort
1. Ja, die Foo-Klasse muss die Traversable-Schnittstelle implementieren

Erklärung
Hier 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:

  1. nicht rekursives Mergesort
  2. Heapsort (Variation des Edsger Dijkstra Smoothsort)
  3. Quicksort Median von drei
  4. introsort

Richtige Antwort
4. introsort

Erklärung
Wird 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:

  1. In einem Fall wird das Schlüsselwort static :) verwendet, dies hat jedoch keine Auswirkungen
  2. Das Ergebnis von getLambda2 () kann nicht an ein Objekt gebunden werden
  3. Sie können also nicht schreiben: Es wird ein Syntaxfehler "Syntaxfehler: statisches Schlüsselwort im falschen Kontext verwendet" angezeigt.
  4. Das Schließen von getLamda2 () kann nur an Klassen binden (bindTo)

Richtige Antwort
2. Das Ergebnis von getLambda2 () kann nicht an ein Objekt gebunden werden

Erklärung
Die 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:

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

Richtige Antwort
4.
 bool(true) bool(false) 


Erklärung
Der 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:

  1. Es werden Ziffern von 0 bis 39 sowie Warnung angezeigt: Ein nicht numerischer Wert, der bei jeder Iteration auftritt
  2. Jede Iteration gibt 'a' + Warnung aus
  3. 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 Antwort
3. 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ärung
Nicht 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.  1 2 3 32332 The end 

  2.  1 2 3 The end 

  3.  The end 

  4.  32332 The end 


Richtige Antwort
3.
 The end 



Erklärung
Auf 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ß!

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


All Articles