Nếu bạn thực sự muốn biết liệu một chuỗi có phải là đại diện hợp lệ của loại số nguyên PHP thực sự không ...
in_array($string, array_map('strval', range(PHP_INT_MIN, PHP_INT_MAX)), true)
Tuy nhiên, điều này là không thể chạy vì bộ quá lớn (sẽ không vừa với bộ nhớ trong trường hợp này, nếu bạn lặp thay vào đó sẽ mất quá nhiều chu kỳ CPU).
Bạn có thể có thể thực hiện tìm kiếm nhị phân với so sánh chuỗi, tuy nhiên có nhiều cách tốt hơn.
Đơn giản nhất:
strlen($string) <= max(strlen((string)PHP_INT_MIN), strlen((string)PHP_INT_MAX)) && $string === (string)(int)$string
Có một số cách khác thường để tiếp cận nó như:
is_int(array_keys([$string => null])[0])
Bạn cũng có thể thực hiện so sánh chuỗi nhưng bạn vẫn cần thực hiện những việc như ctype_digit, kiểm tra độ dài có hợp lý không (không lãng phí CPU trước khi thực hiện những việc như ctype_digit) và xử lý một cách khó xử đối với các số âm.
Lưu ý rằng filter_var không xác nhận chính xác rằng một chuỗi thực sự là biểu diễn của một số nguyên PHP. Nó sẽ cho phép một khoảng trắng hàng đầu và xung quanh.
PHP bên trong sử dụng hàm "_zend_handle_numeric_str" để so sánh nghiêm ngặt nhưng nó không trực tiếp phơi bày điều này ở bất cứ đâu, do đó, mẹo sử dụng các khóa mảng (sử dụng nó để chuyển đổi bất kỳ chuỗi nào biểu thị số nguyên PHP thành số nguyên PHP).
Nếu bạn muốn chuyển đổi an toàn nhị phân sang và từ PHP thì đây là cách tiếp cận cần thực hiện.
Không phải ai cũng muốn điều đó và đó có thể là một trường hợp xử lý đầu vào của người dùng. filter_var không quá tệ cho điều đó và sẽ khá an toàn trong hầu hết các trường hợp cho những người mới sử dụng PHP.
Kiểm tra độ dài, ctype_digit và sau đó kiểm tra giá trị được chuyển đổi trong phạm vi cũng khá chắc chắn cho đầu vào của người dùng. Đề án phức tạp hơn có thể muốn cắt hoặc regex.
Vấn đề với rất nhiều câu trả lời ở đây về khía cạnh đó là trong khi câu hỏi còn mơ hồ, thì câu trả lời không nên có. Nếu bạn định đề xuất một giải pháp, bạn sẽ có thể giải thích chính xác những gì nó sẽ và không mong đợi. Không có điều đó, không có câu trả lời nào phù hợp với câu hỏi hoặc an toàn. Hướng dẫn PHP không phải lúc nào cũng giúp vì nó không giải thích tất cả các cảnh báo cho từng phương thức có liên quan mà nó cung cấp. Những thứ như ctype_digit và is_int rất đáng tin cậy và dễ predit nhưng các chi tiết cụ thể của is_numeric, filter_var và tung hứng (+ $ var) hoặc truyền (intval / floatval) được ghi lại kém.
Đây là fudge PHP cho bạn. Nó có vô số lược đồ để diễn giải các chuỗi dưới dạng số nguyên, với sự không nhất quán. Phương pháp nghiêm ngặt nhất để xác nhận chuỗi số nguyên không được tiếp xúc trực tiếp với người dùng.