PHP 8.3 không chỉ mang đến những tính năng và cải tiến mới mà còn thông báo về các tính năng lỗi thời (deprecations) nhằm hướng tới một PHP sạch sẽ, nhất quán và hiện đại hơn. Việc loại bỏ dần các tính năng không còn phù hợp là một phần quan trọng trong quá trình phát triển của PHP, giúp bảo đảm mã nguồn của bạn sẽ tương thích tốt với các phiên bản tương lai. Trong bài viết này, chúng ta sẽ điểm qua những tính năng đã bị loại bỏ trong PHP 8.3 và các ảnh hưởng của chúng đối với việc phát triển ứng dụng.

1. Hàm dirname không hỗ trợ tham số thứ hai khác 0

Trong PHP, hàm dirname() được sử dụng để lấy đường dẫn thư mục của một tệp. Tuy nhiên, tham số thứ hai của hàm này đã được sử dụng để chỉ định bao nhiêu cấp độ thư mục bạn muốn truy vấn lên.

Trong PHP 8.3, việc truyền giá trị không phải là số nguyên lớn hơn 0 vào tham số thứ hai của dirname() sẽ bị deprecated.

Ví dụ:

php
echo dirname("/var/www/html/file.php", 0);  // Deprecated trong PHP 8.3

Thay vì sử dụng giá trị 0, hãy loại bỏ tham số thứ hai nếu bạn không cần đi lên cấp thư mục nào.

2. utf8_encode()utf8_decode()

Hai hàm utf8_encode()utf8_decode() đã trở nên lỗi thời trong PHP 8.3. Đây là các hàm dùng để chuyển đổi giữa mã hóa UTF-8 và ISO-8859-1. Tuy nhiên, vì cách tiếp cận này hạn chế với nhiều bảng mã khác nhau, PHP 8.3 khuyến nghị sử dụng các thư viện như intl hoặc mbstring để xử lý mã hóa phức tạp.

Giải pháp thay thế:

Sử dụng các hàm như mb_convert_encoding() trong mbstring để thay thế.

php
$encoded = mb_convert_encoding($string, 'UTF-8', 'ISO-8859-1');
$decoded = mb_convert_encoding($encoded, 'ISO-8859-1', 'UTF-8');

3. Tùy chọn setcookie() với tham số true/false cho samesite

Hàm setcookie() được sử dụng để gửi cookie từ máy chủ đến trình duyệt. Trong các phiên bản trước, tham số samesite trong hàm này có thể được đặt là true hoặc false. Từ PHP 8.3, việc sử dụng giá trị Boolean cho tham số samesite bị loại bỏ. Thay vào đó, bạn nên sử dụng chuỗi ('Strict', 'Lax', hoặc 'None') để thiết lập tùy chọn SameSite.

Ví dụ trước khi deprecated:

php
setcookie('test', 'value', ['samesite' => true]);  // Deprecated trong PHP 8.3

Ví dụ khuyến nghị:

php
setcookie('test', 'value', ['samesite' => 'Strict']);  // Sử dụng chuỗi thay vì boolean

4. Deprecated việc sử dụng mb_ereg_replace() với các tham số không được hỗ trợ

Hàm mb_ereg_replace() trong PHP hỗ trợ thay thế biểu thức chính quy (regex) đa byte. Từ PHP 8.3, việc truyền một biến không phải là chuỗi hoặc mảng vào tham số $replacement của hàm này sẽ bị deprecated.

Ví dụ không còn được hỗ trợ:

php
mb_ereg_replace("pattern", 123, "string");  // Deprecated trong PHP 8.3

Giải pháp khuyến nghị:

Hãy bảo đảm rằng tham số $replacement luôn là chuỗi hoặc mảng:

php
mb_ereg_replace("pattern", "replacement", "string");  // Sử dụng chuỗi hợp lệ

5. Hàm gzgetss() bị loại bỏ

Hàm gzgetss() trước đây được sử dụng để đọc một dòng từ một tệp nén và loại bỏ các thẻ HTML hoặc PHP. Trong PHP 8.3, hàm này đã bị deprecated, và lập trình viên được khuyến nghị sử dụng các giải pháp thay thế an toàn hơn như gzgets() kết hợp với strip_tags().

Giải pháp thay thế:

php
$content = gzgets($gz);
$clean_content = strip_tags($content);

6. fgetcsv() không chấp nhận null làm delimiter

Trong PHP 8.3, bạn không còn có thể truyền giá trị null làm tham số delimiter (dấu phân cách) cho hàm fgetcsv(). Điều này là do việc sử dụng null không được định nghĩa rõ ràng và có thể gây ra các hành vi không mong muốn.

Ví dụ deprecated:

php
fgetcsv($file, 0, null);  // Deprecated trong PHP 8.3

Giải pháp khuyến nghị:

Hãy truyền dấu phân cách hợp lệ, chẳng hạn như dấu phẩy , hoặc dấu chấm phẩy ;.

php
fgetcsv($file, 0, ',');  // Sử dụng dấu phân cách hợp lệ

7. Tùy chọn mbstring.func_overload

Trong PHP 8.3, tùy chọn mbstring.func_overload trong tệp cấu hình php.ini đã bị deprecated. Tùy chọn này trước đây cho phép các hàm mbstring tự động thay thế các hàm xử lý chuỗi thông thường của PHP để làm việc với các chuỗi đa byte.

Việc loại bỏ này giúp đảm bảo mã nguồn PHP có thể hoạt động thống nhất mà không phụ thuộc vào cài đặt tùy chỉnh trong môi trường.

Kết luận

Phiên bản PHP 8.3 không chỉ giới thiệu các tính năng mới mà còn cảnh báo về nhiều tính năng sắp bị loại bỏ trong tương lai. Việc hiểu và chuẩn bị trước cho các thay đổi này là rất quan trọng để đảm bảo mã nguồn của bạn luôn tương thích và an toàn. Nếu bạn đang làm việc trên các dự án lớn hoặc duy trì mã nguồn lâu đời, hãy kiểm tra và cập nhật mã để tránh các vấn đề tiềm ẩn do những tính năng deprecated này gây ra.

Hãy luôn theo dõi các bản cập nhật từ PHP và kiểm tra kỹ mã nguồn khi nâng cấp phiên bản mới để tránh gặp phải các lỗi không mong muốn!