Hari ini, akhirnya,
rilis PHP 7.4 diterbitkan!

Fitur-fitur barunya telah berulang kali
dijelaskan , termasuk
di Habré . Ini adalah fungsi panah, properti kelas yang diketik, dan gula sintaksis yang jauh lebih banyak. Tetapi yang terpenting, kami menunggu rilis baru karena
kinerja : dalam versi 7.4, tidak hanya preload yang muncul, tetapi PHP itu sendiri menjadi jauh lebih cepat.
Berita Buruk (atau bagus?) - dengan rilis PHP 7.4, dukungan aktif untuk PHP 7.2
berhenti . Rilis terbarunya
dijadwalkan untuk pertengahan Desember. Kami telah bereksperimen dengan PHP 7.4 untuk waktu yang lama, dan baru-baru ini kami secara aktif terlibat dalam transisi ke PHP, karena sekarang kami berada pada versi 7.2 yang hampir tidak didukung.
Selamat untuk semuanya atas rilis yang telah lama ditunggu-tunggu ini! Dan di bawah ini saya akan berbicara sedikit tentang bagaimana kami meningkatkan ke versi baru.
Terlepas dari kenyataan bahwa kami memiliki basis kode yang besar, kami telah tinggal di PHP selama 13 tahun. Kami telah berulang kali harus memutakhirkan ke versi baru, dan proses transisi sudah mapan.
Jika sangat disederhanakan, kita dapat membedakan beberapa langkah:
- Kami memastikan bahwa unit test mulai berhasil lulus pada versi baru.
- Kami membuat tes berjalan pada versi baru wajib untuk semua perubahan kode (sehingga Anda tidak perlu mengulangi langkah 1, karena kode baru terus-menerus ditulis, dan mungkin lagi tidak kompatibel).
- Kami beralih ke versi baru platform pengembangan, memperbaiki masalah, dan hidup selama beberapa waktu di negara ini.
- Ulangi ini untuk pementasan.
- Kami menyebarkannya dengan lancar di berbagai kluster produksi.
Suntingan kami di repositori PHP
Masalah dengan preload ( fix )
Kali ini, ada sesuatu yang berubah dalam proses: karena kami menunggu preload, kami mulai melakukan sebagian pekerjaan pada bulan Juli, selama versi 7.4.0beta1. Akibatnya, ini menghasilkan sejumlah besar waktu yang dihabiskan untuk debugging bagi kami, karena PHP 7.4 saat itu benar-benar mentah. Tetapi di sisi lain, sebagai hasilnya, kami menemukan bug yang tidak menyenangkan, memperbaikinya dan mengirimkan perbaikan ke hulu, yang membantu seluruh komunitas.
Maka saatnya untuk melakukan tes.
Masalah dengan akses ke properti pribadi ( perbaikan )
Untuk menjalankan tes secara umum, Anda perlu memperbarui PHPUnit, SoftMocks, dan PHP-Parser sebagai bagian dari tes tersebut. Kami memiliki basis kode yang besar, dan bahkan untuk memperbarui PHPUnit diperlukan banyak tes untuk ditulis ulang.
Setelah kami berhasil menjalankan tes, kami melihat hal yang sangat aneh. Ada banyak crash dengan kesalahan berikut:
PHP Fatal error: Cannot access private property ClassLoader::$classMap in vendor/composer/ClassLoader.php
Akses ke properti pribadi kelas hanya dilakukan di dalamnya, tetapi PHP melaporkan kesalahan: Anda tidak dapat mengakses properti pribadi seolah-olah panggilan berasal dari kelas lain.
Masalahnya diperumit oleh fakta bahwa itu direproduksi secara tidak stabil. Debug panjang menggunakan gdb menunjukkan bahwa benar-benar karena alasan tertentu
EG (fake_scope) tidak memiliki kelas di mana properti diakses, tetapi yang lain yang tidak terkait dengannya.
Setelah kami menemukan kasus reproduksi minimal (yang, sesaat, membutuhkan tiga kelas, autoloader dan Refleksi), memperbaiki penyebab masalah dan
mulai memperbaikinya di hulu, ternyata masalah ini sudah ada sejak PHP 7.3 (kemungkinan besar, setelah perubahan
ini ), seluruh dunia tinggal bersamanya selama satu tahun dan dia tidak mengganggu siapa pun sebelum kita.
Aturan ketidakcocokan kode Badoo
Sekarang kami memperbaiki semua ketidaksesuaian kode kami dengan PHP 7.4. Sebagian besar ketidakcocokan bagi kami (lebih dari seratus tempat,> 80% dari semua ketidakcocokan) disebabkan oleh penambahan kesalahan “Mencoba mengakses offset array pada nilai tipe null / bool / int” (
terkait dengan RFC ). Itu terjadi ketika menggunakan sintaks mengakses elemen array pada tipe data lainnya.
Contoh berikut menggambarkan masalah dengan baik:
$a = false; var_dump($a['somekey']);
Begitu saja tampaknya ini tidak boleh terjadi dalam kode nyata, tetapi, seperti yang telah ditunjukkan oleh praktik, ini adalah kasus yang cukup umum: misalnya, fungsi dapat mengembalikan array dalam kasus normal dan false / null jika ada kesalahan, dan lebih lanjut menumpuk informasi tumpukan tentang false / null hilang, dan kasing ini tidak ditangani secara terpisah.
Ini adalah propagasi yang agak lemah, tetapi perubahan yang bermanfaat di PHP: memungkinkan Anda menemukan banyak kesalahan potensial dalam kode.
Pembaruan kedua dalam hal masalah yang diangkat adalah
perubahan cara kerja method_exists (). Omong-omong, saat ini tidak ada informasi tentang itu di catatan rilis atau panduan peningkatan. Esensinya adalah sebagai berikut:
class A1 { private function priv() {} } class B1 extends A1 {} var_dump(method_exists(B1::class, 'priv'));
Fitur ini, sekali lagi, sulit ditemukan dalam kode nyata. Tetapi, ternyata, kami tidak sengaja secara aktif mengeksploitasi ini dalam pengujian.
Tentu saja, kita dihadapkan pada tingkat yang berbeda dengan ketidakcocokan lainnya, termasuk banyak perubahan yang berkaitan dengan refleksi (
contoh satu ,
contoh dua ),
perubahan ke hexdec () dan sejenisnya,
larangan array_key_exists () bahkan untuk objek ArrayAccess, dengan ketidakcocokan dalam berbagai pustaka dependensi yang terhubung melalui Komposer, dan bahkan dengan segala macam hal eksotis, seperti stream_set_option () yang menjadi
wajib bagi stream stream untuk disertakan. Tetapi secara total, biaya adaptasi untuk semua perubahan ini tidak dapat dibandingkan dengan kasus menggunakan sintaks array pada non-array.
Saat ini, kami telah selesai bekerja dengan unit test: semuanya lulus dalam PHP 7.4. Kami sedang mengerjakan tes API dan berencana untuk mulai mengganti berbagai kluster dan lingkungan pada akhir tahun ini.
Saya ingin mengundang Anda ke diskusi ini untuk diskusi: apakah Anda sudah mencoba PHP 7.4? Jika demikian, seperti apa pengalaman Anda? Apakah Anda akan menyeberang?