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 PHPPemenang
egor_nullptrPemenang 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 RecordBonus!
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:- Array (1, 2, 3)
- Array (1, 2, 2)
- Array (3, 2, 1)
- Kesalahan
Jawaban yang benarArray (1, 2, 2)
PenjelasanKarena 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: 0 => flour 1 => wheat
0 => wheat 1 => flour 2 => cupcake
0 => flour 1 => wheat cupcake
cupcake
Jawaban yang benar4.
0 => flour 1 => wheat cupcake
PenjelasanTidak 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:- Ya, kelas Foo harus mengimplementasikan antarmuka Traversable
- Ya, kelas Foo harus mengimplementasikan metode antarmuka ArrayAccess
- Tidak, akan ada kesalahan, argumen dari ...- operator harus berupa array
Jawaban yang benar1. Ya, kelas Foo harus mengimplementasikan antarmuka Traversable
PenjelasanSemuanya 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:- mergesort non-rekursif
- heapsort (variasi smoothsort Edsger Dijkstra)
- median quicksort tiga
- introsort
Jawaban yang benar4. pengantar
PenjelasanDigunakan 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:- Dalam satu kasus, kata kunci :) statis digunakan, tetapi tidak mempengaruhi
- Hasil getLambda2 () tidak dapat diikat ke objek apa pun
- Jadi Anda tidak bisa menulis: akan ada kesalahan sintaksis "Kesalahan sintaksis: kata kunci statis yang digunakan dalam konteks yang salah"
- Penutupan dari getLamda2 () hanya dapat mengikat (bindTo) ke kelas
Jawaban yang benar2. Hasil getLambda2 () tidak dapat terikat ke objek apa pun
PenjelasanMetode 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: bool(false) bool(false)
bool(false) bool(true)
bool(true) bool(true)
bool(true) bool(false)
Jawaban yang benar4.
bool(true) bool(false)
PenjelasanPerbedaan 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:- Digit dari 0 hingga 39 akan ditampilkan, serta Peringatan: Nilai non-numerik dijumpai pada setiap iterasi
- Setiap iterasi akan menampilkan 'a' + Peringatan
- 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 benar3. 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
PenjelasanTidak 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 2 3 32332 The end
1 2 3 The end
The end
32332 The end
PenjelasanPada 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!