Kuis PHP Jumat: beberapa petualangan programmer Brad, satu urutan aneh dan hadiah

Hai Mereka berjanji - kami lakukan: kami melanjutkan serangkaian kuis mini yang didedikasikan untuk berbagai bahasa pemrograman di blog kami (sebelumnya: 1 (untuk pengetahuan tentang Python, PHP, Golang dan DevOps) , 2 (sepenuhnya on Go) ). Rilis hari ini didedikasikan untuk PHP.

Di bawah cut - delapan pertanyaan, beberapa petualangan programmer Brad, satu urutan aneh dan merch keren sebagai hadiah. Kuis berlangsung hingga 4 Juli.

UPD 2: Sesuai kesepakatan, kami memposting analisis tugas kuis. Penjelasan disembunyikan di bawah spoiler setelah jawaban yang benar. Jika Anda masih memiliki pertanyaan, tanyakan di komentar.

UPD: Kami telah selesai menerima jawaban. Terima kasih untuk semua yang berpartisipasi! Kami sedang mempersiapkan peninjauan tugas. Jawabannya ada di dalam teks, dan pemenang dan pemenang hadiah ada di bawah spoiler.
Pemenang dan Pemenang Hadiah dari Kuis PHP

Pemenang


egor_nullptr

Pemenang hadiah


Kami secara acak memilih sepuluh peserta terbaik yang membuat tidak lebih dari dua kesalahan dalam jawaban: Dimd13 , slimus , alexchromets , Donquih0te , TexElless , SamDark , AdmAlexus , voiceofnoise , Raz-Mik , Serj_By .

Draw Record


Bonus!


Bagi mereka yang hanya melakukan satu kesalahan, kami juga memberikan tulang holivny, yang dengannya Anda dapat memutuskan di mana bahasa backend dan kerangka frontend untuk menulis proyek baru Anda / atau membuat yang lama. Mereka diterima: DjSebas , TexElless , Turik-us , offlinewan , voiceofnoise , andrey_96 , senang-maha kuasa .




Aturan gim


Kami akan mengirimkan kit suvenir Avito kepada yang pertama yang akan menjawabnya dengan benar: kaos dengan gajah php, kaus kaki dan tulang holivary (akan mungkin untuk menebak di mana bahasa backend dan kerangka frontend proyek baru Anda akan ditulis).

Kami akan mengirimkan kaus kaki Avito ke sepuluh orang lain yang menjawab dengan benar . Mari kita bermain dengan bantuan pengacak. Dia akan menentukan siapa yang akan pergi dua kaos lagi dan satu set tulang.



Opsi pertanyaan dan jawaban


Pertanyaan 1


Apa yang akan dihasilkan kode:

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

Opsi Jawaban:

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

Jawaban yang benar
Array (1, 2, 2)

Penjelasan
Karena dalam php variabel yang dibuat dalam loop tetap hidup setelah selesai, pada awal loop kedua variabel $ value adalah referensi ke elemen terakhir dari array. Selama iterasi foreach terakhir, nilai-nilai dari array ditulis ke elemen terakhirnya (karena $ value adalah referensi). Ini akan terlihat seperti array pada setiap iterasi dari loop kedua:
1. [1, 2, 1]
2. [1, 2, 2]
3. [1, 2, 2]

Pertanyaan 2


Apa yang akan dihasilkan kode:

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

Opsi Jawaban:

  1.   0 => flour 1 => wheat 

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

  3.  0 => flour 1 => wheat cupcake 

  4.  cupcake 



Jawaban yang benar
4.
 0 => flour 1 => wheat cupcake 



Penjelasan
Tidak ada komentar Hanya sedikit contoh rumit dengan generator.

Pertanyaan 3


Suatu ketika, programmer Brad memutuskan untuk mem-port satu perpustakaan dari Go ke PHP untuk mengumpulkan bintang di GitHub, dan bertanya-tanya:

Apakah konstruksi berikut ini mungkin?

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

Opsi Jawaban:

  1. Ya, kelas Foo harus mengimplementasikan antarmuka Traversable
  2. Ya, kelas Foo harus mengimplementasikan metode antarmuka ArrayAccess
  3. Tidak, akan ada kesalahan, argumen dari ...- operator harus berupa array

Jawaban yang benar
1. Ya, kelas Foo harus mengimplementasikan antarmuka Traversable

Penjelasan
Semuanya sederhana di sini. Dari dokumentasi Argument Unpacking:
Array dan objek yang mengimplementasikan antarmuka Traversable dapat dibongkar ke dalam daftar argumen ketika diteruskan ke fungsi menggunakan operator ...


Pertanyaan 4


Algoritma pengurutan apa yang digunakan di jantung PHP untuk fungsi seperti pengurutan, dll.?

Opsi Jawaban:

  1. mergesort non-rekursif
  2. heapsort (variasi smoothsort Edsger Dijkstra)
  3. median quicksort tiga
  4. introsort

Jawaban yang benar
4. pengantar

Penjelasan
Digunakan oleh introsort. Kode sumber dapat dilihat di Github . Dokumentasi menyebutkan penggunaan quicksort, tetapi tidak ada kontradiksi di sini, karena introsort adalah algoritma penyortiran hybrid, di mana penyortiran penyisipan digunakan untuk sejumlah kecil elemen, dan kemudian algoritma yang lebih cepat digunakan: quicksort atau heapsort.


Pertanyaan 5


Ada kode:

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

Pertanyaan: apakah ada perbedaan antara nilai balik getLambda dan getLambda2?

Opsi Jawaban:

  1. Dalam satu kasus, kata kunci :) statis digunakan, tetapi tidak mempengaruhi
  2. Hasil getLambda2 () tidak dapat diikat ke objek apa pun
  3. Jadi Anda tidak bisa menulis: akan ada kesalahan sintaksis "Kesalahan sintaksis: kata kunci statis yang digunakan dalam konteks yang salah"
  4. Penutupan dari getLamda2 () hanya dapat mengikat (bindTo) ke kelas

Jawaban yang benar
2. Hasil getLambda2 () tidak dapat terikat ke objek apa pun

Penjelasan
Metode getLambda2 () mengembalikan fungsi anonim statis yang tidak dapat terikat ke objek melalui metode -> bindTo (). Penggunaannya jarang dalam kode, tapi tetap saja

Pertanyaan 6


Apa yang akan dihasilkan kode:

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

Opsi Jawaban:

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

Jawaban yang benar
4.
 bool(true) bool(false) 


Penjelasan
Perbedaan antara && dan dan dalam prioritas. Ekspresi $ d = $ a && $ b berfungsi seperti $ d = ($ a && $ b). Tetapi ekspresi $ c = $ a dan $ b bekerja secara berbeda dan dapat direpresentasikan sebagai (($ c = $ a) dan $ b).

Pertanyaan 7


Apa yang akan dihasilkan kode:

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

Opsi Jawaban:

  1. Digit dari 0 hingga 39 akan ditampilkan, serta Peringatan: Nilai non-numerik dijumpai pada setiap iterasi
  2. Setiap iterasi akan menampilkan 'a' + Peringatan
  3. Urutan aneh:
     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 

Jawaban yang benar
3. Urutan aneh:
 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 


Penjelasan
Tidak semua orang tahu, tetapi operator penambahan dapat diterapkan ke karakter. Dari dokumentasi:
PHP mengikuti konvensi Perl (bukan C) tentang operasi aritmatika dengan variabel karakter. Misalnya, dalam PHP dan Perl $ a = 'Z'; $ a ++; akan menetapkan $ a ke 'AA', sedangkan dalam C a = 'Z'; a ++; memberikan nilai ke '[' (nilai ASCII dari 'Z' adalah 90, dan nilai ASCII dari '[' adalah 91).


Pertanyaan 8


Apa yang akan dihasilkan kode:

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

Opsi Jawaban:

  1.  1 2 3 32332 The end 

  2.  1 2 3 The end 

  3.  The end 

  4.  32332 The end 


Jawaban yang benar
3.
 The end 



Penjelasan
Pada pandangan pertama, sepertinya fungsi tidak mengembalikan generator, karena ekspresi hasil tidak dapat dijangkau. Namun, setiap fungsi yang mengandung ekspresi hasil secara otomatis menjadi fungsi generator. RFC asli mengatakan demikian. Pada saat iterasi pertama, generator mulai mengeksekusi kode fungsi dari awal hingga ekspresi hasil yang tersedia pertama, tetapi karena tidak ada di sana, generator menyelesaikan pekerjaannya tanpa mentransfer data apa pun ke loop.

Ringkasan


Kami akan memposting jawaban atas pertanyaan dengan memperbarui posting pada hari Rabu, 4 Juli . Jika Anda memutuskan - letakkan jawaban di bawah spoiler agar tidak merusak kesenangan orang lain. Dan jangan lupa untuk memeriksa akun Habr setelah kuis berakhir.

Selamat menikmati!

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


All Articles