♻️ Tối đa hóa khả năng tương thích PHP cho WordPress 6.4 và thư mục plugin
WordPress 6.4 "Shirley" đã được phát hành. Khuyến nghị chạy với PHP 8.1 hoặc 8.2, nhưng phiên bản PHP tối thiểu được hỗ trợ vẫn là 7.0.
Do đó, các plugin WordPress của chúng tôi cần (càng nhiều càng tốt) hỗ trợ PHP xuống tận phiên bản 7.0, đồng thời tương thích với PHP 8.1 và 8.2.
Cách hợp lý nhất để làm điều đó là viết code cho các plugin bằng PHP 7.0, trong khi:
- Không sử dụng các tính năng đã bị deprecated trong PHP 7.x, vì những tính năng đó sẽ bị xóa trong PHP 8.x
- Không sử dụng các tính năng đã bị deprecated trong PHP 8.x, vì chúng sẽ tạo ra cảnh báo
Để đảm bảo code plugin tương thích, chúng ta cần kiểm thử kỹ lưỡng trên nhiều môi trường khác nhau, chạy các phiên bản PHP khác nhau.
Viết code bằng PHP 7.x có một nhược điểm rõ ràng: code plugin phải tương thích với PHP 8.x, nhưng không thể sử dụng bất kỳ tính năng nào của nó, chẳng hạn như union types, biểu thức match, toán tử nullsafe, và nhiều tính năng khác.
Có một giải pháp thay thế tốt hơn.
Hạ cấp code PHP từ 8.x xuống 7.x
Thay vì viết code bằng PHP 7 và đảm bảo nó hoạt động với PHP 8, chúng ta có thể làm ngược lại: viết code plugin bằng PHP 8 và hạ cấp xuống PHP 7.
Điều này khả thi nhờ Rector, một công cụ tự động hóa việc tái cấu trúc code PHP.
Rector cung cấp các quy tắc để hạ cấp code từ PHP 8.1 xuống PHP 7.2. Điều này có nghĩa là chúng ta có thể sử dụng các tính năng hiện đại này trong các plugin WordPress của mình, vì chúng có thể được hạ cấp thành code PHP 7.2.
Ví dụ, quy tắc DowngradeMatchToSwitchRector chuyển đổi toán tử match thành toán tử 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;
+ }
}
}Lưu ý rằng các quy tắc chỉ hỗ trợ hạ cấp xuống PHP 7.2, không phải xuống tận PHP 7.1 và 7.0. Tuy nhiên, đây không phải là vấn đề lớn, vì hai phiên bản PHP này kết hợp chỉ chiếm 3% các trang WordPress.
Hạ cấp code là một cách tiếp cận tốt hơn, vì:
- Bằng cách viết code bằng PHP 8.1, chúng ta hoàn toàn chắc chắn rằng code sẽ tương thích với PHP 8.1 và 8.2.
- Miễn là chúng ta sử dụng các tính năng PHP có quy tắc hạ cấp tương ứng, code cũng sẽ hoạt động với PHP 7.2, 7.3 và 7.4.
- Chúng ta có thể tận dụng các tính năng của PHP 8.x, chẳng hạn như union types, biểu thức match, toán tử nullsafe, và nhiều tính năng khác.
Lưu ý rằng không phải tất cả các tính năng PHP 8.x đều có sẵn. Ví dụ, chưa có quy tắc nào để hạ cấp enumerations, nên chúng ta không thể sử dụng chúng.
Về việc kiểm thử, không có sự khác biệt nào: Chúng ta cũng phải kiểm thử kỹ lưỡng plugin trên nhiều môi trường, chạy các phiên bản PHP khác nhau, để đảm bảo an toàn.
Cách hạ cấp code
Gato GraphQL được phát triển với PHP 8.1 và hạ cấp xuống PHP 7.2 cho môi trường production.
Việc hạ cấp code, kiểm thử và sau đó phát hành plugin cho production đều được tự động hóa thông qua các workflow GitHub Actions:
downgrade_php_tests.yml: Hạ cấp code và phân tích bằng PHP 7.2generate_plugins.yml: Tạo plugin để phát hành, hạ cấp xuống PHP 7.2integration_tests.yml: Cài đặt plugin vừa tạo trên một tập hợp các instance InstaWP chạy các phiên bản PHP khác nhau và thực hiện kiểm thử tích hợp
Để tìm hiểu thêm, tôi đã viết một số bài viết về chủ đề này:
- 🦸🏿♂️ Gato GraphQL hiện đã được transpile từ PHP 8.0 sang 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
Hy vọng bạn thấy điều này hữu ích 🙏