Wawancara pengembang Php pada tahun 2020

Kebetulan tahun ini saya menjalani serangkaian wawancara untuk posisi pengembang PHP, yang belum saya lakukan selama beberapa tahun. Menjadi orang yang malas praktis, sebelum wawancara, saya mencoba mencari kumpulan pertanyaan dan jawaban, tetapi semua yang saya temukan agak lama, jadi saya memutuskan untuk menyiapkan daftar pertanyaan yang saya temui sendiri.



Biasanya, artikel semacam ini memberikan jawaban lengkap atas pertanyaan, tetapi jika Anda mewawancarai untuk posisi yang cukup serius, ringkasan singkat jelas tidak akan cukup dan Anda perlu memahami pertanyaan itu sendiri dengan cukup dalam, jadi saya terutama memasukkan tautan ke dokumentasi atau artikel tentang masalah yang dijelaskan.



PHP



  1. Apa yang baru di PHP 7. *
  2. Tipe data
  3. Ketik petunjuk + mode ketat
  4. Perbandingan yang kuat versus longgar
  5. Bekerja dengan tautan
  6. Salin-saat-tulis
  7. Jalankan penanganan kesalahan waktu
  8. Penutupan
  9. Fungsi array
  10. list()
  11. //
  12. Final
  13. Reflection API
  14. Autoloader
  15. SPL
  16. APC/APCu
  17. OPcache
  18. PSR standards
  19. Composer
  20. XDebug
  21. Rest API


OOP



  1. //
  2. /
  3. Traits
  4. GRASP
  5. SOLID
  6. Kiss
  7. Dry


Databases

Docker

HTTP



JS



PHP



PHP 7.*



Eh, saya ingat saat-saat ketika saya menceritakan perbedaan antara versi 4 dan 5, tidak pernah melihat yang ke-4 di mata saya, tradisi lama harus diperhatikan, pertanyaan muncul di hampir semua wawancara, dan meskipun tidak ada yang mengharapkan Anda untuk mengingat secara harfiah di versi yang mana perubahan telah terjadi, secara umum, informasi ini perlu diketahui:





Tipe data



Meskipun PHP adalah bahasa dinamis, semua data di dalamnya memiliki jenis yang berbeda:

Jenis skalar:



  • bool
  • int
  • float (terkadang nama double ditemukan, yang untuk php tidak ada bedanya)
  • tali


Jenis campuran:

  • Himpunan
  • obyek
  • callable
  • iterable


Jenis khusus:



  • sumber
  • batal


Baca lebih lanjut tentang tipe dan tipe semu dalam dokumentasi .



Ketik petunjuk + mode ketat



Sebagai kelanjutan logis dari topik tipe dan pengetikan kuat yang disertakan dengan php 7. *, Anda perlu mengetahui tentang perbedaan antara pengetikan kuat dan lemah, lihat dokumentasi untuk detailnya .



Perbandingan yang kuat versus longgar



Anda perlu memahami perbedaan antara perbandingan longgar (perbandingan nilai tanpa memperhatikan tipe datanya) dan perbandingan ketat (dengan mempertimbangkan tipe data akun), yang mencerminkan tabel ini dengan cukup baik . Kita juga harus menyoroti perbandingan objek yang ketat dan longgar .



Bekerja dengan tautan



Referensi dalam PHP kira-kira merupakan cara untuk mengakses variabel yang sama (area memori) dengan nama yang berbeda.



Operasi utama yang dapat dilakukan dengan tautan:





Penting untuk memahami secara spesifik objek yang lewat. Anda dapat membaca bahwa di php semua objek diteruskan oleh referensi

ya, tapi sebenarnya tidak



Ini benar sebelum php5, tetapi sekarang hanya pengenal objek yang diteruskan ( dokumentasi ).

Singkatnya, jika Anda membuat sebuah objek, dan meneruskannya ke suatu fungsi, di dalamnya Anda telah melakukannya

$object = null;
ini tidak berarti bahwa objek asli juga akan disetel ulang ke nol, Anda masih dapat mengerjakannya. Tetapi jika Anda secara eksplisit mengirimkan objek dengan referensi, tindakan ini juga akan "membidik" objek aslinya.



Salin-saat-tulis



Setiap kali variabel dilewatkan ke suatu fungsi, nilainya (secara teoritis) harus disalin. Ini mungkin bukan masalah untuk data integer atau float, tapi bayangkan Anda meneruskan array yang berisi sepuluh juta nilai ke suatu fungsi. Untuk menghindarinya, PHP menggunakan paradigma copy-on-write. Jadi, pada kenyataannya, ketika Anda mentransfer sebuah array, penyalinannya tidak akan terjadi sampai Anda tidak ingin mengubah apapun dalam array ini. Artikel dengan penjelasan lebih detail.



Jalankan penanganan kesalahan waktu



Pada php versi ke-7 terdapat sejumlah perubahan yang berhubungan dengan error hierarki (informasi lebih lanjut tentang hierarki tersebut ), jika tidak diharapkan pemohon mengetahui bagaimana cara menangkap pengecualian , atau bahkan dapat menulis error_handlernya sendiri .



Penutupan



Mereka juga merupakan fungsi anonim, paling berguna sebagai nilai untuk parameter callback, dokumentasi . Ada artikel bagus, meskipun sedikit artikel lama tentang bekerja dengan penutupan di Habré .



Fungsi array



Sering diminta untuk menyebutkan semua fungsi untuk bekerja dengan array yang Anda ingat dari memori. Dan meskipun, menurut pendapat saya, pertanyaan ini sedikit lebih dari tidak ada artinya, daftar fungsinya dapat diulang dari dokumentasi .



Fungsi daftar ()



Berkat perubahan di PHP 7.1, fungsi ini menjadi lebih nyaman digunakan, akibatnya, lebih sering digunakan, semua informasi dapat ditemukan di dokumentasi .



Ruang lingkup variabel



Dalam banyak kasus, semua variabel hanya memiliki satu ruang lingkup , dengan pengecualian global / superglobals, yang, seperti namanya, tersedia di mana saja, serta statis / konstanta.



Lingkup konstanta properti / metode / kelas



Ini didefinisikan menggunakan kata kunci publik (terlihat oleh semua orang), dilindungi (hanya tersedia untuk kelas saat ini atau turunannya) atau pribadi (hanya tersedia untuk kelas saat ini), dan dapat digunakan baik untuk properti / metode dan sejak PHP 7.1 untuk konstanta kelas. Baca lebih lanjut di dokumentasi .



Kelas dan metode terakhir



Dengan menempatkan kata kunci terakhir di depan deklarasi metode kelas, Anda dapat mencegahnya diganti dalam kelas turunan, dan jika kelas itu sendiri dinyatakan final, ia tidak dapat diturunkan. Kelas dan metode seperti itu dirancang untuk melindungi kode sensitif dari perubahan, dan kode itu sendiri menjadi lebih mudah untuk dipelihara.

Baca lebih lanjut di dokumentasi .



Penautan statis terlambat



Dinyatakan sebagai perbedaan antara memanggil self :: dan static ::. "Pengikatan akhir" berarti bahwa static :: akan dievaluasi pada waktu proses dan dapat didefinisikan ulang dalam kelas turunan. Baca lebih lanjut di dokumentasi .



Metode ajaib



Dalam PHP, sama sekali tidak ada tempat tanpa sihir, jadi kami memiliki metode yang memungkinkan kami untuk mengimplementasikan fungsionalitas tambahan untuk suatu objek, menimpa perilaku standar objek (misalnya, __serialize () / __ unserialize ()), atau perilaku objek dalam situasi atipikal (__toString ()) dan orang lain.

Dokumentasi , dan artikel bagus tentang habr .



Variabel dinamis



Anda dapat meneruskan nama dari satu variabel ke variabel lainnya dan kemudian menggunakan variabel itu "secara dinamis".



Mereka harus digunakan dengan sangat hati-hati, karena mereka dapat mempersulit membaca dan memelihara kode secara signifikan (seringkali tidak mungkin untuk memahami apa yang ada dalam variabel tanpa menjalankan kode), tetapi mereka bisa sangat berguna dalam abstraksi. Baca lebih lanjut di dokumentasi .



Generator



Generator (kata kunci hasil) membuat iterator sederhana untuk menghemat memori dalam situasi di mana Anda perlu mengulang data dalam jumlah besar. Mereka bisa sedikit sulit untuk dipahami sebelum Anda menulis generator.



Deskripsi ada dalam dokumentasi , dan ada yang agak lama (namun, sintaks generator tidak berubah sejak saat itu) dan artikel yang bagus tentang Habré .



API Refleksi



Singkatnya, ini adalah kemampuan untuk melihat ke dalam kode Anda sendiri (atau orang lain), mencari tahu variabel, metode, konstanta apa yang dimiliki kelas, dan menjadikannya publik jika diinginkan. Kemampuan ini secara aktif digunakan oleh kerangka kerja (misalnya, dalam simfoni untuk pembuatan otomatis injeksi ketergantungan) dan pustaka. Deskripsi dalam dokumentasi dan, tentu saja, artikel tentang Habré .



Pemuat Otomatis



Biasanya, pada proyek, sangat jarang perlu menerapkan autoloading class sendiri, tetapi untuk perusahaan yang menulis semua solusi sendiri (misalnya, perusahaan besar yang tidak ingin bekerja dengan open source), atau beberapa proyek khusus, ini relevan. Ini juga dapat membantu untuk memahami cara kerjanya.





SPL



Atau Standart PHP Library - sekumpulan kelas (struktur data, iterator, pengecualian, kelas untuk memproses file), antarmuka dan fungsi untuk memecahkan masalah standar. Sebagai aturan, mengetahui perpustakaan dengan hati tidak diperlukan, tetapi memahami terdiri dari apa setidaknya untuk pengembangan pribadi. Rincian lebih lanjut dalam dokumentasi - www.php.net/manual/ru/book.spl.php



APC / APCu



Cache PHP alternatif (APC) atau cache alternatif tanpa opcode (APCu) adalah cache sumber terbuka gratis yang dirancang untuk melakukan cache dan mengoptimalkan kode perantara PHP. Ini terutama digunakan untuk menyimpan perhitungan di antara permintaan. Dokumentasi:







OPcache



Meningkatkan kinerja PHP dengan menyimpan bytecode skrip yang dikompilasi dalam memori bersama, sehingga menghilangkan kebutuhan PHP untuk memuat dan mengurai skrip pada setiap permintaan. Dokumentasi resmi , serta artikel yang sangat bagus tentang cara kerjanya di Habré .



Standar PSR



Rekomendasi Standar PHP - standar untuk pengkodean, serta antarmuka untuk tugas-tugas umum. Standar ini digunakan di semua kerangka kerja (saya kenal), dan memfasilitasi interaksi antara perpustakaan yang berbeda. Dokumentasi resmi serta artikel bagus tentang Habré .



Komposer



Dependency manager , serta alat yang mengimplementasikan pemuatan otomatis kode library dan aplikasi itu sendiri. Dapat membantu mengoptimalkan dan mempercepat aplikasi produksi Anda .



XDebug



Sebagian besar pengembang menggunakan ekstensi ini untuk mempermudah bekerja dengan kode atau untuk mengoptimalkannya, pengetahuan dasar di sini adalah cara mengatur dan menjalankannya, artikel berikut blog.denisbondar.com/post/phpstorm_docker_xdebug akan membantu dalam hal ini .



Rest API



REpresentational State Transfer adalah pendekatan arsitektural yang memungkinkan Anda mengatur interaksi antar aplikasi menggunakan semua kemampuan HTTP. Artikel bagus tentang topik ini dan juga perbedaan antara REST dan SOAP .

Dalam konteks API, Anda perlu memahami format pertukaran data dasar, paling sering XML dan JSON .



Tes



Semua tes unit didasarkan pada PHPUnit (sejauh yang saya tahu), dan hari ini, kemampuan dan pengetahuan menulis tes adalah bagian wajib dari pengembangan. Banyak kerangka kerja (seperti Symfony) menawarkan pembungkus dan solusi pengujiannya sendiri. Berikut artikel bagus tentang alat pengujian terbaik .



OOP



Enkapsulasi / pewarisan / polimorfisme



  • . , , , . , . .. . ( ) . , , .
  • . , , , .
  • Polimorfisme . Ini adalah properti yang memungkinkan satu dan nama yang sama digunakan untuk menyelesaikan beberapa masalah yang berbeda secara teknis. Secara sederhana, konsep polimorfisme adalah gagasan "satu antarmuka, banyak implementasi". Ini berarti Anda dapat membuat antarmuka umum untuk sekelompok tindakan terkait.


Kelas / metode abstrak



  • Tidak melibatkan instansiasi.
  • Mereka menerapkan dalam praktik salah satu prinsip OOP - polimorfisme.
  • Mungkin berisi metode dan properti abstrak. Metode abstrak tidak diimplementasikan untuk kelas yang dideskripsikan, tetapi harus diimplementasikan untuk turunan non-abstraknya.
  • Mereka mewakili abstraksi paling umum, yaitu memiliki volume terbesar dan konten paling sedikit.


Nuansa implementasi dalam dokumentasi .



Antarmuka



Antarmuka, tidak seperti kelas abstrak, tidak dapat berisi bidang dan metode yang memiliki implementasi - hanya menjelaskan tanda tangan metode yang harus diterapkan oleh pewarisnya. Tidak seperti kelas abstrak yang sama, kelas dapat mengimplementasikan banyak antarmuka secara bersamaan. Dokumentasi



resmi , dan artikel bagus tentang Habré .



Sifat



Ciri ini sangat mirip dengan kelas, tetapi ini dimaksudkan untuk mengelompokkan fungsionalitas dan penggunaan kembali lebih lanjut dalam satu set kelas yang tidak dapat ditautkan oleh satu kelas abstrak. Kadang-kadang juga dikatakan bahwa suatu sifat adalah cara untuk mengimplementasikan multiple inheritance dalam PHP.



Karena setiap kelas dapat mengimplementasikan banyak ciri, konflik dapat muncul ketika metode yang sama diimplementasikan pada ciri yang berbeda dan / atau pada kelas itu sendiri. Baca lebih lanjut tentang ciri-ciri dalam dokumentasi .



Template GRASP



Pola Perangkat Lunak Penugasan Tanggung Jawab Umum - pola desain untuk memecahkan masalah umum. Tidak seperti pola dari Gang of Four, pola GRAPS tidak memiliki struktur yang jelas, ruang lingkup yang jelas dan masalah spesifik yang harus dipecahkan, tetapi hanya mewakili pendekatan / rekomendasi / prinsip umum yang digunakan dalam desain desain sistem.



Artikel bagus tentang topik ini - habr.com/ru/post/92570



Geng empat pola



Topik pola sangat luas, banyak artikel telah ditulis di atasnya, dan mustahil untuk mencoba mendeskripsikannya dalam beberapa kalimat. Saya suka sumber daya ini - refactoring.guru/ru/design-patterns/catalog , tetapi Anda dapat menggunakan tautan ini jika perlu .



PADAT



Semua orang bertanya padanya, tapi mereka bertanya secara berbeda.



Pilihan buruk - Anda diminta membaca prinsip dan definisinya dari ingatan.

Baik - mereka memberi tahu Anda sebuah asas, dan meminta Anda untuk menjelaskannya, menjelaskan contoh penggunaan, munculkan situasi nyata ketika asas ini atau itu akan membantu dalam beberapa cara. Opsi ini, menurut saya, membuatnya jauh lebih baik untuk memahami level kandidat dan pemahaman prinsipnya yang sebenarnya.



Di Habré Anda dapat menemukan lusinan artikel yang sangat bagus tentang prinsip-prinsip ini, jadi saya menautkan ke media .



Ciuman



Sederhanakan, bodoh adalah prinsip yang baik, yang intinya sudah terdapat pada judul, anda bisa pelajari lebih lanjut disini .



Kering



Jangan ulangi diri Anda sendiri - prinsip bahwa Anda harus menggunakan kembali kode Anda jika memungkinkan. Lebih lengkapnya di sini .



Database



Artikel yang bagus tentang database SQL dapat ditemukan di sini . Pertanyaan tentang database NoSql dalam kasus saya biasanya ditemukan pada contoh MongoDB . Dalam kasus ElasticSearch, perpustakaan pembungkus biasanya digunakan, informasi umum dapat ditemukan di artikel tentang Habré .



Dalam penyimpanan memori (yang menyimpan nilai dalam RAM) adalah memcache dan / atau redis (paling sering), sebagai aturan, bekerja dengannya dilakukan melalui perpustakaan pembungkus, jika Anda ingin memahami masalah secara lebih rinci, tentu saja ada artikel di Habré .



Buruh pelabuhan



Alat yang sangat penting yang telah digunakan di hampir semua proyek (dalam kasus saya). Dan meskipun sering dikonfigurasi sekali per proyek, Anda perlu mengetahui konsep dasar dan prinsip bekerja dengannya. Secara pribadi, saya suka artikel ini untuk wawancara kerja .



HTTP dan protokol lainnya



Tentu saja, setiap pengembang web harus mengetahui dan memahami cara kerja protokol transfer data (setidaknya protokol tingkat atas). Topiknya besar dan sulit untuk dimasukkan ke dalam beberapa kalimat, ada artikel ekstensif tentang topik ini di Habré .



Otorisasi dan otentikasi



Otorisasi adalah pemberian hak untuk melakukan tindakan tertentu, serta proses verifikasi hak saat mencoba melakukan tindakan tersebut.



Otentikasi adalah prosedur otentikasi, seperti memverifikasi identitas pengguna dengan membandingkan kata sandi yang dimasukkan olehnya.



Penting untuk memahami perbedaan antara otorisasi dan otentikasi , bagaimana penerapannya menggunakan sesi dan cookie , Token Web JSON ( JWT ), dll.



Js



Saya tidak terlalu mengerti bahasa ini, jadi saya tidak pernah berpura-pura menjadi posisi di mana Anda perlu tahu js framework dan menjadi full-stack, mungkin itu sebabnya untuk semua wawancara ada cukup pengetahuan yang dijelaskan dalam artikel - habr.com/ru/post/486820



All Articles