Чтобы привести значение к другому типу, поставьте тип в скобках перед ним: (int) "42" даёт целое число 42. Функция intval("42") делает то же самое. Приведение никогда не завершается ошибкой: текст, который не является числом, становится 0, а у строки, начинающейся с цифр, остаются только эти цифры.
В PHP есть приведения (int), (float), (string), (bool), (array) и (object). Для каждого есть и функция: intval(), floatval(), strval(), boolval().
Строка в int: что возвращают (int) и intval()
PHP читает цифры с начала строки, пропустив начальные пробелы, и останавливается на первом символе, который не подходит для числа. Экспоненциальная запись считается числом, префикс 0x нет.
Обратите внимание: "12.7" превращается в 12, приведение к int отбрасывает дробную часть, а не округляет. Ни (int), ни intval() здесь не печатают предупреждений, каким бы ни был ввод.
intval() с основанием
intval($value, $base) читает строку в другой системе счисления. С основанием 0 PHP смотрит на префикс: 0x для шестнадцатеричных, 0b для двоичных, ведущий 0 для восьмеричных.
Float в int: отбрасывание, а не округление
(int) отбрасывает всё после десятичной точки, в сторону нуля. Если нужно ближайшее целое, сначала округлите, и следите за скобками:
Последняя пара это классическая ловушка float: (0.1 + 0.7) * 10 хранится как 7.999999..., поэтому отбрасывание дробной части даёт 7. Если сначала округлить, получится 8. round, floor и ceil описаны на странице о математике.
Приведение к bool, string и array
В false при приведении к bool превращаются лишь несколько значений: 0, 0.0, "", "0", null и []. Всё остальное true, включая "0.0", " " и "false".
При приведении к строке true становится "1", а false и null оба становятся "". У float отбрасывается конечное .0, а очень большие или очень маленькие float записываются в экспоненциальной форме.
Приведение массива к строке не склеивает его. Этот код выводит Tags: Array:
<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;
и PHP добавляет предупреждение:
Warning: Array to string conversion in /home/index.php on line 3
Чтобы превратить массив в текст, используйте implode(", ", $array) или json_encode($array).
Все приведения сразу
Выберите значение, чтобы увидеть, что для него возвращают intval, (bool), strval, is_numeric и gettype. Каждую ячейку вычислил PHP 8.3.
| $x | intval | bool | strval | is_numeric | gettype |
|---|---|---|---|---|---|
| "10" | |||||
| "1abc" | |||||
| "abc" | |||||
| "" | |||||
| " " | |||||
| "0" | |||||
| "0.0" | |||||
| "1e1" | |||||
| "010" | |||||
| 1.5 | |||||
| true | |||||
| false | |||||
| null | |||||
| [] | |||||
| [1, 2] |
Числовые строки и автоматическое приведение
Числовая строка это строка, которая выглядит как число: "12", "-3.5", "1e3", возможно с пробелами вокруг. PHP автоматически приводит такие строки в арифметике, а is_numeric() сообщает, подходит ли строка.
"12abc" + 1 по-прежнему даёт 13, но PHP 8 печатает Warning: A non-numeric value encountered, а "abc" + 1 выбрасывает TypeError. Приводите или проверяйте пользовательский ввод до арифметики.
settype() и gettype()
settype() меняет тип переменной на месте, а gettype() сообщает его. get_debug_type() возвращает более короткие имена, которые встречаются в сообщениях об ошибках (int, float, string).
В большинстве кода вместо этого используют приведение ($value = (int) $value;), потому что оно короче и читается так же.
Проверяйте ввод, а не приводите его
(int) никогда не отказывает, поэтому (int) "abc" молча становится 0, а (int) "5 apples" становится 5. Для данных из формы используйте filter_var с FILTER_VALIDATE_INT: функция возвращает целое число или false.
Сравнивайте результат через === false, потому что 0 это допустимое целое число, а == false его бы отклонило. Диапазоны и другие валидаторы показаны на странице про filter_var.
Часто задаваемые вопросы
Как преобразовать строку в int в PHP?
Используйте (int) $str или intval($str); для основания 10 результат одинаковый. (int) "42" даёт 42, (int) "12abc" даёт 12, а (int) "abc" даёт 0. Чтобы отклонить ввод, который не является целым числом, используйте filter_var($str, FILTER_VALIDATE_INT): функция вернёт false, а не будет угадывать.
Чем intval() отличается от (int) в PHP?
Для основания 10 они возвращают одно и то же. intval() принимает ещё и основание: intval('ff', 16) даёт 255, а с основанием 0 функция читает префиксы 0x, 0b и ведущий 0 для восьмеричных чисел. Так как это функция, intval можно передать как колбэк, например в array_map('intval', $values).
Что возвращает (bool) "0" в PHP?
false. Строка "0" входит в список ложных значений PHP вместе с "", 0, 0.0, null и []. Любая другая строка даёт true, включая "0.0", " " и "false".
Как преобразовать число в строку в PHP?
Используйте (string) $n, strval($n) или подставьте число в строку: "$n". (string) 3.0 даёт "3"; для фиксированного числа знаков после запятой используйте number_format($n, 2) или sprintf('%.2f', $n).