Lập trình · 26/09/2026

PHP in_array: Kiểm tra danh sách cho phép mà không nhầm kiểu dữ liệu

Một tham số chỉ được phép nhận vài giá trị cố định thường được kiểm tra bằng in_array. Tuy nhiên, nếu bỏ qua kiểu dữ liệu, chương trình có thể chấp nhận một giá trị không đúng hợp đồng API. Thêm chế độ so sánh nghiêm ngặt là bước nhỏ, nhưng cần đi cùng quy tắc đầu vào rõ ràng.

PHP in_array: Kiểm tra danh sách cho phép mà không nhầm kiểu dữ liệu

Một tham số chỉ được phép nhận vài giá trị cố định thường được kiểm tra bằng in_array. Tuy nhiên, nếu bỏ qua kiểu dữ liệu, chương trình có thể chấp nhận một giá trị không đúng hợp đồng API. Thêm chế độ so sánh nghiêm ngặt là bước nhỏ, nhưng cần đi cùng quy tắc đầu vào rõ ràng.

1. Giá trị giống nhau chưa chắc cùng kiểu

$allowed = [10, 20];

var_dump(in_array('10', $allowed));       // bool(true)
var_dump(in_array('10', $allowed, true)); // bool(false)
var_dump(in_array(10, $allowed, true));   // bool(true)

Tài liệu PHP về in_array xác định chế độ mặc định dùng so sánh lỏng. Tham số thứ ba là true yêu cầu khớp cả kiểu. Hàm tìm trong giá trị của mảng, không phải tên khóa.

Ví dụ trên không nói rằng chuỗi '10' luôn sai. Nó cho thấy cần quyết định API chấp nhận số nguyên, chuỗi hay cả hai. Quyết định đó phải xuất phát từ hợp đồng dữ liệu, không phải từ việc một phép so sánh tình cờ trả true.

2. Ví dụ kiểm tra định dạng xuất báo cáo

Giả sử ứng dụng chỉ hỗ trợ hai tên định dạng viết thường: csv và json. Ta muốn từ chối số, Boolean, mảng và các chuỗi khác, thay vì tự đoán ý người gửi. Hàm sau dùng mixed, cần PHP 8 trở lên:

function requireExportFormat(mixed $value): string
{
    $allowed = ['csv', 'json'];

    if (!is_string($value) || !in_array($value, $allowed, true)) {
        throw new InvalidArgumentException('Unsupported export format');
    }

    return $value;
}

Hàm chỉ kiểm tra tên định dạng; nó không tạo file và không quyết định ai được xuất dữ liệu. Lớp HTTP cần chuyển lỗi đầu vào thành phản hồi phù hợp, còn quyền truy cập báo cáo phải được kiểm tra riêng.

3. Chuẩn hóa có chủ đích, không ép kiểu để qua kiểm tra

Theo hợp đồng trên, CSV và chuỗi có khoảng trắng quanh csv đều bị từ chối. Nếu sản phẩm muốn hỗ trợ chúng, hãy kiểm tra kiểu trước, rồi chuẩn hóa theo một quy tắc được công bố, sau đó mới kiểm tra danh sách.

Tránh ép mọi đầu vào thành số chỉ để khớp danh sách số nguyên. Một chuỗi không hợp lệ có thể bị biến thành giá trị khác ý người gửi. Với định danh có số 0 ở đầu, chuyển thành số còn có thể làm mất thông tin cần giữ.

Nên đặt bước chuẩn hóa tại một nơi có tên rõ ràng, thay vì để controller, service và job mỗi nơi tự đổi dữ liệu theo cách riêng. Khi điều tra lỗi, cả nhóm cần biết giá trị nào đã được kiểm tra và giá trị nào thực sự được sử dụng.

4. Danh sách cho phép không thay thế phân quyền

Việc csv là định dạng hợp lệ không có nghĩa người dùng được xem mọi báo cáo. Tương tự, một mã trạng thái hợp lệ không có nghĩa mọi tài khoản được chuyển bản ghi sang trạng thái đó.

Tách ba câu hỏi: đầu vào có đúng kiểu không, giá trị có thuộc tập hỗ trợ không, và người gọi có quyền thực hiện hành động với dữ liệu này không. Chúng có thể được kiểm tra ở các lớp khác nhau nhưng không được bỏ sót câu nào.

5. Checklist kiểm thử

  • csv và json trả đúng chuỗi ban đầu.
  • CSV và ' csv ' bị từ chối theo hợp đồng hiện tại.
  • Chuỗi rỗng, xml và null bị từ chối.
  • true, false, 0 và mảng không vượt qua kiểm tra.
  • Định dạng hợp lệ nhưng thiếu quyền vẫn không được xuất báo cáo.
  • Nếu thay quy tắc chuẩn hóa, cập nhật tài liệu và test cùng lúc.

Các trường hợp trên là kỳ vọng cho hàm minh họa, không phải kết quả kiểm thử toàn bộ ứng dụng. So sánh nghiêm ngặt giúp điều kiện dễ dự đoán; hợp đồng đầu vào và kiểm tra quyền mới làm quy trình xử lý đầy đủ.

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.