Để chuyển một giá trị sang kiểu khác, đặt tên kiểu trong ngoặc đơn ngay trước nó: (int) "42" cho ra số nguyên 42. Dạng hàm intval("42") làm điều tương tự. Ép kiểu (type casting) không bao giờ thất bại: văn bản không phải số trở thành 0, còn chuỗi bắt đầu bằng chữ số chỉ giữ lại những chữ số đó.
PHP có các phép ép kiểu (int), (float), (string), (bool), (array) và (object). Mỗi phép còn có một hàm tương ứng: intval(), floatval(), strval(), boolval().
Chuỗi sang int: (int) và intval() trả về gì
PHP đọc chữ số từ đầu chuỗi, sau khi bỏ qua khoảng trắng ở đầu, và dừng lại ở ký tự đầu tiên không thuộc về một con số. Ký hiệu số mũ được tính là số, còn tiền tố 0x thì không.
Để ý "12.7" trở thành 12: ép sang int cắt bỏ phần thập phân, không làm tròn. Cả (int) lẫn intval() đều không in cảnh báo nào ở đây, bất kể dữ liệu đầu vào là gì.
intval() với hệ cơ số
intval($value, $base) đọc chuỗi theo một hệ đếm khác. Với cơ số 0, PHP nhìn vào tiền tố: 0x cho hệ thập lục phân, 0b cho hệ nhị phân, số 0 ở đầu cho hệ bát phân. Bạn có thể kiểm tra mọi kết quả bên dưới bằng công cụ chuyển đổi hệ cơ số.
Float sang int: cắt bỏ, không làm tròn
(int) bỏ mọi thứ sau dấu thập phân, theo hướng về 0. Hãy làm tròn trước nếu bạn muốn số nguyên gần nhất, và để ý dấu ngoặc:
Cặp cuối cùng là cái bẫy kinh điển của số thực: (0.1 + 0.7) * 10 được lưu thành 7.999999..., nên cắt bỏ phần thập phân cho ra 7. Làm tròn trước sẽ cho 8. Trang toán học trình bày round, floor và ceil.
Ép kiểu sang bool, string và array
Khi ép sang bool, chỉ một số ít giá trị trở thành false: 0, 0.0, "", "0", null và []. Mọi thứ khác đều là true, kể cả "0.0", " " và "false".
Khi ép sang string, true trở thành "1", còn false và null đều trở thành "". Số thực bỏ đi phần .0 ở cuối, còn số thực rất lớn hoặc rất nhỏ dùng ký hiệu số mũ.
Ép một mảng sang chuỗi không nối các phần tử lại. Đoạn này in ra Tags: Array:
<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;
và PHP thêm một cảnh báo:
Warning: Array to string conversion in /home/index.php on line 3
Dùng implode(", ", $array) hoặc json_encode($array) để biến một mảng thành văn bản.
Mọi phép ép kiểu trong một bảng
Chọn một giá trị để xem intval, (bool), strval, is_numeric và gettype trả về gì với nó. Mọi ô đều do PHP 8.3 tính ra.
| $x | intval | bool | strval | is_numeric | gettype |
|---|---|---|---|---|---|
| "10" | |||||
| "1abc" | |||||
| "abc" | |||||
| "" | |||||
| " " | |||||
| "0" | |||||
| "0.0" | |||||
| "1e1" | |||||
| "010" | |||||
| 1.5 | |||||
| true | |||||
| false | |||||
| null | |||||
| [] | |||||
| [1, 2] |
Chuỗi số và chuyển đổi tự động
Chuỗi số (numeric string) là chuỗi trông giống một con số: "12", "-3.5", "1e3", có thể có khoảng trắng xung quanh. PHP tự động chuyển đổi chúng trong phép tính số học, và is_numeric() cho bạn biết một chuỗi có đạt điều kiện hay không.
"12abc" + 1 vẫn cho ra 13, nhưng PHP 8 in ra Warning: A non-numeric value encountered, còn "abc" + 1 ném ra TypeError. Hãy ép kiểu hoặc kiểm tra trước khi tính toán với dữ liệu người dùng nhập.
settype() và gettype()
settype() đổi kiểu của một biến ngay tại chỗ và gettype() cho biết kiểu đó. get_debug_type() trả về những tên ngắn hơn mà bạn thấy trong thông báo lỗi (int, float, string).
Phần lớn code dùng phép ép kiểu ($value = (int) $value;) thay thế, vì ngắn hơn mà đọc vẫn như nhau.
Kiểm tra dữ liệu nhập thay vì ép kiểu
(int) không bao giờ từ chối, nên (int) "abc" lặng lẽ thành 0 và (int) "5 apples" thành 5. Với dữ liệu từ form, hãy dùng filter_var với FILTER_VALIDATE_INT: hàm này trả về số nguyên hoặc false.
So sánh kết quả bằng === false, vì 0 là một số nguyên hợp lệ và == false sẽ từ chối nó. Trang filter_var trình bày cách kiểm tra khoảng giá trị và các bộ kiểm tra khác.
Câu hỏi thường gặp
Làm sao để chuyển chuỗi sang int trong PHP?
Dùng (int) $str hoặc intval($str); với hệ cơ số 10, hai cách cho cùng kết quả. (int) "42" là 42, (int) "12abc" là 12 và (int) "abc" là 0. Để từ chối dữ liệu nhập không phải số nguyên, hãy dùng filter_var($str, FILTER_VALIDATE_INT), hàm này trả về false thay vì đoán.
intval() và (int) trong PHP khác nhau thế nào?
Với hệ cơ số 10, chúng trả về cùng kết quả. intval() còn nhận thêm hệ cơ số: intval('ff', 16) là 255, và với cơ số 0 nó đọc các tiền tố như 0x, 0b và số 0 ở đầu cho hệ bát phân. Vì là hàm, intval còn có thể truyền vào như một callback, ví dụ array_map('intval', $values).
(bool) "0" trong PHP trả về gì?
false. Chuỗi "0" là một trong các giá trị được coi là sai của PHP, cùng với "", 0, 0.0, null và []. Mọi chuỗi khác đều là true, kể cả "0.0", " " và "false".
Làm sao để chuyển số sang chuỗi trong PHP?
Dùng (string) $n, strval($n) hoặc đặt nó vào trong chuỗi: "$n". (string) 3.0 là "3"; để có số chữ số thập phân cố định, dùng number_format($n, 2) hoặc sprintf('%.2f', $n).