Bagaimana mempersiapkan situs WordPress Anda untuk PHP 8

Diterbitkan: 2022-07-06

Situs WordPress membutuhkan PHP, dan seiring perkembangan PHP, WordPress terus mengikutinya. Baru-baru ini, PHP 7.4 telah menjadi versi default PHP di Platform VIP WordPress. Namun, karena PHP 7.4 akan mengakhiri dukungan keamanannya pada November 2022, situs WordPress perlu ditingkatkan untuk menjaga keamanan yang kuat. Untuk alasan ini, platform VIP WordPress akan memindahkan semua aplikasi pelanggan kami untuk berjalan di PHP 8.0.

Berikut ini adalah deskripsi perubahan, dan langkah-langkah yang dapat dilakukan oleh pelanggan kami dan orang lain yang menggunakan WordPress di platform lain.

Daftar Isi

  • Cerita PHP 8.0
    • Fitur baru
    • Proliferasi dukungan di seluruh komunitas PHP dan WordPress
  • Bagaimana menemukan masalah kompatibilitas PHP 8.0
    • Gunakan PHP_CodeSniffer dengan standar PHPCompatibility
    • Atasi Peringatan PHP yang diketahui yang merupakan kesalahan fatal PHP di bawah PHP 8.0
    • Buat tes otomatis
    • Gunakan PHPStan/Psalm atau alat analisis statis lainnya
  • Bagaimana memulai dengan PHP 8.0 di WordPress VIP
    • Jalankan aplikasi secara lokal
    • Periksa Bot Analisis Kode VIP pada permintaan tarik
    • Aktifkan PHP 8 di aplikasi VIP WordPress Anda
    • Manfaatkan bantuan proaktif
  • Bagaimana dengan PHP 8.1?

Cerita PHP 8.0

Dirilis pada November 2020, PHP 8.0 menyediakan beberapa peningkatan dan fitur yang membuat kode baru (dan kode yang lebih pendek) lebih tahan terhadap bug.

Sebagian besar pengembang akan menemukan manfaat besar dalam PHP 8.0. Namun, sebagai versi utama, itu memang mengandung beberapa perubahan yang melanggar. Ini membuat peralihan dari PHP 7.4 ke PHP 8.0 lebih sulit daripada, misalnya, perubahan dari PHP 7.3 ke PHP 7.4. Secara khusus, ada 49 perubahan yang melanggar pada inti PHP, dan 169 di seluruh PHP 8 secara keseluruhan, termasuk di perpustakaan dan ekstensi yang dapat diandalkan oleh kode Anda.

Kabar baiknya adalah setelah organisasi beralih ke PHP 8.0, mereka akan menerima dukungan keamanan dari proyek inti PHP hingga November 2023. Setelah tanggal tersebut, organisasi perlu meningkatkan ke PHP 8.1, rilis kecil yang memerlukan perubahan yang jauh lebih kecil.

Fitur baru

PHP 8.0 dirancang untuk 1) memperbaiki kasus tepi dan inkonsistensi untuk menjadikan PHP bahasa skrip yang lebih solid dan dapat diprediksi, dan 2) menyediakan fitur baru untuk meningkatkan bahasa secara keseluruhan. Ini termasuk beberapa sintaks baru yang:

  • Mempermudah penulisan kode yang diketik dengan ketat, misalnya tipe union, tipe static dan mixed , Stringable interface, dan perubahan penanganan angka.
  • Kurangi jumlah kode yang harus Anda pertahankan, misalnya, operator nullsafe, promosi properti konstruktor, operator match , dan tangkapan yang tidak menangkap.
  • Sederhanakan kode seperti mengizinkan ::class pada objek, tanda koma di daftar parameter, str_contains() , str_starts_with() , dan str_ends_with() fungsi, ekspresi lempar, atribut.

Ini juga termasuk Parameter Bernama. Namun, perlu dicatat bahwa inti WordPress tidak mengklaim kompatibilitas dengan fitur ini. Jadi meskipun Anda dapat memanggil fungsi kustom Anda sendiri dengan parameter bernama, Anda tidak boleh memanggil fungsi WordPress, karena nama parameter dapat berubah tanpa peringatan di masa mendatang.

Proliferasi dukungan di seluruh komunitas PHP dan WordPress

Setiap kali versi baru PHP dirilis yang menyertakan sintaks baru, dibutuhkan waktu agar sintaks baru didukung di seluruh komunitas PHP dan WordPress.

Alat pengembang PHP

Alat pengembangan PHP seperti Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug, dan berbagai IDE semuanya perlu mengenali sintaks baru dari versi baru PHP. Sementara PHP terus dikembangkan, mungkin ada jeda waktu sebelum ekosistem lengkap di sekitar versi baru tersedia. Namun, sering kali, perkakas dapat siap digunakan pada saat rilis final siap karena pekerjaan pengembangan telah dilakukan berdasarkan rilis alpha , beta , dan rilis kandidat yang telah tersedia sebelumnya. Semua alat ini dan lebih banyak lagi sekarang mendukung PHP 8.0, yang menjadikannya pilihan yang baik untuk mengembangkan kode PHP dan khususnya untuk mengembangkan WordPress.

inti WordPress

Selanjutnya, inti WordPress perlu mendukung PHP 8.0. Proyek WordPress memiliki sejarah panjang kompatibilitas dengan versi baru PHP pada saat dirilis. Per posting yang ditulis dengan baik di Make WP ini, WordPress telah memiliki "kompatibilitas beta" dengan PHP 8.0 sejak rilis WordPress 5.6 pada Desember 2020. Apa yang dimaksud dengan "kompatibilitas beta"? Ini berarti WordPress dapat berjalan dengan baik di PHP 8.0, tetapi fitur seperti mendeklarasikan tipe yang ketat dalam file inti WordPress, atau menggunakan parameter bernama dengan fungsi inti WordPress, tidak didukung.

Platform VIP WordPress

Platform VIP WordPress telah mendukung PHP 8.0 (dan PHP 8.1) sejak Mei 2022, termasuk rangkaian plugin dan fitur yang memungkinkan platform memenuhi kebutuhan perusahaan.

Plugin pihak ketiga

WordPress memiliki puluhan ribu plugin, dan tingkat dukungan untuk PHP 8.0 sangat bervariasi. Misalnya, kata-kata yang baru dicadangkan mungkin masih digunakan oleh plugin, atau parameter yang diteruskan ke fungsi asli PHP mungkin bukan jenis yang diharapkan sekarang. Dengan demikian, plugin pihak ketiga mungkin menjadi salah satu area di mana ketidaksesuaian dengan PHP 8.0 dapat memengaruhi aplikasi Anda.

Di bawah ini Anda dapat mempelajari cara memeriksa beberapa ketidaksesuaian ini. Pilihannya termasuk meminta individu/tim hulu untuk melakukan perbaikan dan membuat rilis baru, atau meminta tim pengembangan internal atau agensi, seperti salah satu mitra unggulan kami, melakukan fork plugin dan membuat perbaikan sendiri.

Plugin khusus

Hampir setiap pelanggan di platform VIP WordPress menggunakan satu atau lebih plugin khusus. Seperti plugin pihak ketiga, mereka juga perlu diperiksa kompatibilitasnya. Meminta pengembang asli untuk mengatasi masalah yang ditemukan umumnya merupakan tindakan terbaik.

Tema pihak ketiga atau kustom

Meskipun plugin adalah sumber masalah kompatibilitas yang paling mungkin, jangan lupa bahwa pihak ketiga dan tema khusus juga harus kompatibel dengan PHP 8.0. Pendekatan yang sama untuk memeriksa kompatibilitas kode plugin berlaku untuk kode tema.

Bagaimana menemukan masalah kompatibilitas PHP 8.0

Ada empat pendekatan utama yang dapat digunakan tim pengembangan untuk meninjau kode guna menentukan masalah kompatibilitas:

  1. Gunakan PHP_CodeSniffer dengan standar PHPCompatibility.
  2. Atasi Peringatan PHP yang dikenal yang merupakan Kesalahan Fatal PHP di bawah PHP 8.0.
  3. Buat tes otomatis.
  4. Gunakan PHPStan/Psalm atau alat analisis statis lainnya.

Gunakan PHP_CodeSniffer dengan standar PHPCompatibility

PHP_CodeSniffer (PHPCS) memberi tokenizes file PHP dan mendeteksi pelanggaran terhadap seperangkat standar pengkodean yang ditentukan. Ada paket untuk Standar Pengkodean WordPress, dan Standar Pengkodean VIP kami sendiri (yang kami anjurkan untuk digunakan pelanggan).

Ada juga paket yang disebut PHPCompatibility dan PHPCompatibilityWP, dan standar ini menganalisis basis kode untuk kompatibilitas lintas versi PHP.

Karena hasilnya bergantung pada kemampuan dan kesiapan alat, penting untuk menggunakan cabang develop PHPCompatibility hingga versi 10 dirilis. Versi 10 akan berisi sniff yang terkait dengan kompatibilitas PHP 8.0 (dan PHP 8.1). Lihat dokumen kami untuk petunjuk tentang cara mengatur konfigurasi Anda untuk menggunakan cabang develop . Setelah versi 10 dirilis, Anda dapat menggunakan versi itu sebagai gantinya.

Paket PHPCompatbilityWP dibangun di atas paket PHPCompatibility tetapi mematikan beberapa pemeriksaan untuk item kompatibilitas mundur yang berisi inti WordPress itu sendiri.

Dengan pengaturan PHPCS dan PHPCompatibility/PHPCompatibilityWP, Anda dapat menjalankan pemeriksaan:

 phpcs --standard=PHPCompatibilityWP --severity=1 --runtime-set testVersion 8.0- --extensions=php <path-to-code>

<path-to-code> dapat berupa satu plugin atau tema khusus atau pihak ketiga jika Anda ingin memulai dari yang kecil, atau seluruh repositori jika Anda ingin melihat semua pelanggaran yang perlu diselidiki dan ditangani.

Langkah-langkah pemindaian tidak akan mendeteksi setiap kemungkinan masalah kompatibilitas versi PHP (seperti jenis nilai runtime yang salah), tetapi mereka akan membantu mengidentifikasi masalah paling umum yang terkait dengan sintaks.

Atasi Peringatan PHP yang diketahui yang merupakan kesalahan fatal PHP di bawah PHP 8.0

PHP 8.0 melihat beberapa peringatan mesin yang direklasifikasi, di mana Peringatan menjadi Kesalahan fatal dan Pengecualian TypeError (dan beberapa Pemberitahuan menjadi Peringatan). Teks Peringatan PHP yang harus dicari di bawah PHP 7.4 adalah:

  • Attempt to assign property '*' of non-object
  • Attempt to modify property '*' of non-object
  • Attempt to increment/decrement property '*' of non-object
  • Creating default object from empty value
  • Cannot use a scalar value as an array
  • Cannot add element to the array as the next element is already occupied
  • Cannot unset offset in a non-array variable
  • Only arrays and Traversables can be unpacked
  • Invalid argument supplied for foreach()
  • Illegal offset type
  • Illegal offset type in isset or empty
  • Illegal offset type in unset
  • Cannot assign an empty string to a string offset
  • Division by zero
  • Use of undefined constant *

Memperbaiki Peringatan ini sangat penting agar aplikasi kompatibel dengan PHP 8.0.

Catatan: Ada kesalahan fatal lainnya di bawah PHP 8.0 yang bahkan bukan Peringatan di bawah PHP 7.4. Contohnya meliputi:

  • Metode pribadi tidak dapat dinyatakan final kecuali untuk konstruktor.
  • Tanda tangan tidak valid untuk metode ajaib.
  • Validasi tanda tangan metode sifat abstrak
  • Menggunakan parent:: dengan kelas induk.
  • Tanda tangan metode kelebihan beban yang tidak kompatibel (Prinsip Substitusi Liskov)

Mengatasi perubahan yang diketahui ini adalah tempat yang baik untuk memulai. TypeError akan secara konsisten dilempar untuk semua fungsi PHP internal, misalnya ketika tipe parameter yang tidak valid dilewatkan, bahkan ketika pemeriksaan tipe yang ketat tidak dideklarasikan.

Juga, perhatikan bahwa operator @ tidak akan lagi membungkam kesalahan fatal di bawah PHP 8.0.

Secara alami, aplikasi Anda idealnya tidak menghasilkan kesalahan, tidak ada peringatan, dan tidak ada pemberitahuan. Anda didorong untuk mengatasi apa pun yang Anda temukan. Beberapa Peringatan PHP di bawah 8.x akan menjadi kesalahan fatal di bawah PHP 9.0, misalnya, berpotensi menghasilkan logika yang salah di bawah PHP 8.x. Membangun dalam waktu pengembangan sebelum dan sesudah rilis untuk memperbaiki masalah tersebut dan masalah yang "lolos dari penemuan" selama pengembangan adalah praktik terbaik. Ini juga merupakan investasi dalam stabilitas situs, dan kemampuannya untuk secara akurat memenuhi kriteria penerimaan untuk fitur terkait.

Buat tes otomatis

Ada banyak jenis pengujian otomatis yang berbeda, tetapi yang kami maksud di sini adalah:

  • Pengujian unit —mengolok-olok semua fungsi atau kelas yang ditentukan WordPress, dan tidak memerlukan instance database agar tersedia untuk menjalankan pengujian.
  • Tes integrasi— memuat WordPress dan menggunakan database pengujian yang sebenarnya

Topik ini terlalu besar untuk dibahas dengan baik di sini, tetapi ada beberapa hal yang perlu dipertimbangkan:

  • Hasilnya tergantung pada kelengkapan test suite. Jika Anda tidak memiliki banyak tes, maka Anda akan kekurangan cakupan yang diperlukan untuk memastikan kompatibilitas.
  • Gunakan pernyataan yang tegas. Misalnya, menggunakan assertEquals() melakukan perbandingan longgar, sedangkan assertSame() juga memeriksa jenisnya.
  • Gunakan cakupan kode yang ketat. Tambahkan beStrictAboutCoversAnnotations=”true” dan forceCoversAnnotations=”true” ke file konfigurasi PHPUnit, lalu gunakan anotasi @covers untuk menemukan tingkat cakupan kode internasional yang akurat di seluruh pengujian.
  • Uji jalur bahagia (perilaku berdasarkan input yang diharapkan) dan jalur tidak bahagia (perilaku berdasarkan input tak terduga) untuk memastikan bahwa fungsi gagal dengan cara yang diharapkan, karena di sinilah sebagian besar masalah terkait keketatan terjadi.
  • Jalankan pengujian Anda pada PHP 8.0. Untuk pengujian Integrasi (WordPress), perubahan dilakukan pada tahun 2021 pada rangkaian pengujian inti WordPress yang dibuka menggunakan versi PHPUnit yang lebih baru, yang pada gilirannya mendukung PHP 8.0. Ini didukung oleh paket WP Test Utils, yang mencakup PHPUnit Polyfills, dukungan Brain Monkey dan Mockery, rintisan fungsi tambahan untuk fungsi WordPress, dan akses ke semua utilitas uji asli WP seperti metode pabrik untuk pembuatan konten.
  • Pertimbangkan untuk menulis tes sebelum mencoba perbaikan, untuk lebih yakin bahwa perubahan kompatibilitas telah berhasil.

Gunakan PHPStan/Psalm atau alat analisis statis lainnya

Sementara PHPCS akan menangkap beberapa ketidakcocokan, ada beberapa perubahan runtime yang tidak dirancang untuk ditangkap oleh PHPCS. Salah satu contoh yang akan terlewatkan adalah fungsi PHP asli yang lebih ketat dengan tipe apa yang dapat diteruskan sebagai parameter.

Alat seperti PHPStan, Psalm, atau alat analisis statis lainnya dapat membantu di sini. Tetapi, agar paling efektif, mereka mengharuskan basis kode Anda untuk menggunakan tipe yang ketat (parameter dan tipe pengembalian dalam kode), atau didokumentasikan dengan benar ( baris @param dan @return di DocBlocks).

Alat-alat ini biasanya memiliki tingkat aturan yang memungkinkan untuk memperbaiki masalah tingkat terendah terlebih dahulu, dan kemudian secara bertahap mengintegrasikan alat lebih lanjut untuk meningkatkan kualitas basis kode Anda.

Anda dapat menambahkan pengetahuan untuk jenis kode inti WordPress melalui ekstensi seperti phpstan-wordpress dan mazmur-plugin-wordpress.

Setelah dikonfigurasi, setiap proses akan menyorot tempat Anda meneruskan tipe yang tidak diharapkan ke dalam fungsi, yang dapat menyebabkan Pengecualian TypeError yang fatal dilempar. Masing-masing akan perlu diperbaiki.

Dalam banyak kasus, Anda mungkin dapat menekan pengecualian TypeError melalui penggunaan blok try-catch atau typecasting. Namun, kami sangat menyarankan Anda tidak melakukannya. Memperbaiki akar penyebab akan menghasilkan kode yang lebih kuat, tidak rapuh, dan rawan kesalahan, dan hampir selalu membuahkan hasil dalam jangka panjang.

Bagaimana memulai dengan PHP 8.0 di WordPress VIP

Jalankan aplikasi secara lokal

Menjalankan instance aplikasi secara lokal adalah langkah pertama yang masuk akal untuk dapat mendeteksi dan memperbaiki masalah kompatibilitas apa pun. Meskipun Anda dapat menggunakan lingkungan pengembangan lokal apa pun, untuk memastikan paritas terbaik dengan platform VIP WordPress, kami merekomendasikan Lingkungan Pengembangan Lokal VIP. Dengan menjalankan perintah vip dev-env create --php=8.0 (dengan VIP-CLI 2.9.5 atau yang lebih baru) dan kemudian menyelesaikan sisa Setup Wizard, aplikasi Anda akan berjalan secara lokal dengan PHP 8.0.

Periksa Bot Analisis Kode VIP pada permintaan tarik

Jika Anda melihat permintaan tarik yang dibuat ke repositori Anda di bawah organisasi wpcomvip, Anda akan melihat Bot Analisis Kode VIP memberi Anda umpan balik tentang PHPCS, linting PHP, dan linting SVG.

Untuk langkah PHP Linting, bot akan menghubungkan kode PHP dengan versi PHP apa pun yang digunakan untuk aplikasi yang digunakan repositori. Jika versi itu adalah PHP 7.4, sekarang akan secara otomatis menggunakan PHP 8.0 juga, sebagai persiapan untuk peralihan yang akan datang.

Aktifkan PHP 8 di aplikasi VIP WordPress Anda

Setelah Anda selesai memeriksa dan memperbaiki sebanyak mungkin secara lokal, saatnya untuk mengaktifkan PHP 8.0 pada aplikasi VIP WordPress Anda. Mulailah dengan lingkungan terendah Anda, dan periksa apakah semuanya terlihat baik (termasuk log PHP melalui vip-cli atau Log Kesehatan di Dasbor VIP) sebelum pindah ke lingkungan produksi.

Untuk mengaktifkan PHP 8.0 di lingkungan, buka tiket Zendesk yang memberi tahu kami aplikasi dan lingkungan mana yang Anda inginkan untuk mengaktifkannya.

Kami akan segera merilis fitur baru di Dasbor VIP agar versi PHP dapat diubah tanpa perlu membuka tiket. Selalu periksa Lobby untuk informasi terbaru.

Manfaatkan bantuan proaktif

Tim akun untuk pelanggan Premier telah menghubungi pelanggan untuk mendiskusikan bagaimana kami dapat mendukung mereka. Mereka akan dikirimi hasil dari PHPCS dan diberikan panduan tentang cara menjalankan pemeriksaan ini sendiri. PHP Peringatan yang akan menjadi kesalahan fatal juga akan disorot, memberi mereka langkah awal untuk mengatasi ketidaksesuaian.

Bagaimana dengan PHP 8.1?

Platform VIP WordPress juga mendukung PHP 8.1. Ada lebih sedikit perubahan antara PHP 8.0 dan PHP 8.1 dibandingkan antara PHP 7.4 dan 8.0, yang berarti bahwa harus ada lebih sedikit ketidakcocokan untuk ditangani.

PHP 8.1:

  • Memiliki dukungan aktif dari pengembang inti PHP hingga November 2023, dan dukungan keamanan hingga November 2024.
  • Dapat menangani lebih banyak permintaan per detik daripada PHP 8.0.
  • Memiliki dukungan “beta compatibility” di WordPress 5.9 dan di atasnya – ini berarti ada beberapa pemberitahuan penghentian dalam persiapan untuk PHP 9, tetapi tidak mempengaruhi perilaku inti WordPress.

Perubahan berguna yang diperlukan untuk PHP 8.0, seperti menggunakan kode yang diketik dengan ketat dan menambahkan tes otomatis, akan membantu peluncuran PHP 8.1, serta peningkatan untuk WordPress 6.1, 6.2, 6.3 dan seterusnya, serta rilis fitur apa pun yang Anda lakukan. Proses QA sering kali menjadi hambatan, jadi menggunakan beberapa alat dan pendekatan yang telah kami uraikan dapat mengurangi tenaga kerja manual dan memberi Anda lebih percaya diri saat menerapkan perubahan ini.

Jika pelanggan memiliki pertanyaan tentang PHP 8.0, silakan buka tiket bersama kami.