♻️ Memaksimalkan kompatibilitas PHP untuk WordPress 6.4 dan direktori plugin
WordPress 6.4 "Shirley" telah dirilis. Disarankan untuk menjalankannya menggunakan PHP 8.1 atau 8.2, tetapi versi PHP minimum yang didukung masih 7.0.
Oleh karena itu, plugin-plugin WordPress kami perlu (sebisa mungkin) mendukung PHP hingga ke versi 7.0, dan kompatibel dengan PHP 8.1 dan 8.2.
Cara yang paling logis untuk melakukan itu adalah dengan mengkode plugin kami menggunakan PHP 7.0, dengan:
- Tidak menggunakan fitur yang telah didepresi di PHP 7.x, karena fitur tersebut sudah dihapus di PHP 8.x
- Tidak menggunakan fitur yang telah didepresi di PHP 8.x, karena fitur tersebut akan menimbulkan peringatan
Untuk memastikan bahwa kode plugin kompatibel, kami perlu mengujinya secara menyeluruh di beberapa lingkungan, menjalankan berbagai versi PHP.
Mengkode dalam PHP 7.x memiliki kelemahan yang jelas: Kode plugin harus kompatibel dengan PHP 8.x, namun tidak dapat menggunakan fitur-fiturnya, seperti union types, ekspresi match, operator nullsafe, dan banyak lainnya.
Ada alternatif yang lebih baik.
Menurunkan versi kode PHP dari 8.x ke 7.x
Alih-alih mengkode dalam PHP 7 dan memastikannya berjalan dengan PHP 8, kita bisa melakukan kebalikannya: Mengkode plugin dalam PHP 8, dan menurunkan versinya ke PHP 7.
Ini dimungkinkan berkat Rector, sebuah alat untuk mengotomatiskan refactoring kode PHP.
Rector menyediakan aturan untuk menurunkan versi kode dari PHP 8.1 ke PHP 7.2. Ini berarti kita dapat menggunakan fitur-fitur modern ini di plugin WordPress kami, karena fitur-fitur tersebut dapat diturunkan menjadi kode PHP 7.2.
Sebagai contoh, aturan DowngradeMatchToSwitchRector mengonversi operator match menjadi operator switch:
class SomeClass
{
public function run()
{
- $message = match ($statusCode) {
- 200, 300 => null,
- 400 => 'not found',
- default => 'unknown status code',
- };
+ switch ($statusCode) {
+ case 200:
+ case 300:
+ $message = null;
+ break;
+ case 400:
+ $message = 'not found';
+ break;
+ default:
+ $message = 'unknown status code';
+ break;
+ }
}
}Perlu diperhatikan bahwa aturan-aturan ini hanya berguna untuk menurunkan versi hingga PHP 7.2, bukan sampai ke PHP 7.1 dan 7.0. Namun ini bukan masalah besar, karena kedua versi PHP ini digabungkan hanya mewakili 3% dari situs WordPress.
Menurunkan versi kode adalah pendekatan yang lebih baik, karena:
- Dengan mengkode dalam PHP 8.1, kita benar-benar yakin bahwa kode kami akan kompatibel dengan PHP 8.1 dan 8.2.
- Selama kita menggunakan fitur PHP yang memiliki aturan penurunan versi, kode tersebut juga akan berjalan di PHP 7.2, 7.3 dan 7.4.
- Kita dapat memanfaatkan fitur-fitur PHP 8.x, seperti union types, ekspresi match, operator nullsafe, dan banyak lainnya.
Perlu diperhatikan bahwa tidak semua fitur PHP 8.x tersedia. Misalnya, belum ada aturan (sejauh ini) untuk menurunkan versi enumerations, sehingga kita tidak dapat menggunakannya.
Mengenai pengujian, tidak ada perbedaan: Kita juga harus menguji plugin secara menyeluruh di beberapa lingkungan, menjalankan berbagai versi PHP, untuk memastikan keamanannya.
Cara menurunkan versi kode
Gato GraphQL dikembangkan dengan PHP 8.1, dan diturunkan ke PHP 7.2 untuk produksi.
Menurunkan versi kode dan mengujinya, kemudian merilis plugin untuk produksi, semuanya diotomatiskan melalui workflow GitHub Actions:
downgrade_php_tests.yml: Menurunkan versi kode dan menganalisisnya menggunakan PHP 7.2generate_plugins.yml: Menghasilkan plugin untuk rilis, dengan menurunkannya ke PHP 7.2integration_tests.yml: Menginstal plugin yang baru dibuat di sejumlah instans InstaWP yang menjalankan berbagai versi PHP, dan menjalankan integration tests
Untuk mengetahui lebih lanjut, saya telah menulis beberapa artikel tentang topik ini:
- 🦸🏿♂️ Gato GraphQL sekarang di-transpile dari PHP 8.0 ke 7.1
- Transpiling PHP code from 8.0 to 7.x via Rector
- Coding in PHP 7.4 and deploying to 7.1 via Rector and GitHub Actions
Semoga bermanfaat 🙏