Введение: почему строки не хотят складываться?
Каждый разработчик, который хоть раз писал на PHP, сталкивался с ситуацией, когда вместо ожидаемого числа получается странный результат. Вы пытаетесь сложить две переменные, полученные из формы или базы данных, а PHP выдаёт что-то вроде 1520 вместо 35. Знакомо? Это классическая проблема: преобразование строки в число в PHP.
PHP — язык с динамической типизацией. Это одновременно и благословение, и проклятие. С одной стороны, он пытается угадать, что вы имели в виду, и автоматически конвертирует типы. С другой — такие "угадайки" часто приводят к трудноуловимым багам. Сегодня мы разберём все способы преобразования строки в число в PHP — от простого до продвинутого — и научимся делать это правильно.
Короткий ответ: 4 способа за 30 секунд
Если вам нужно быстрое решение — вот шпаргалка. Но не спешите закрывать статью: каждый метод имеет свои особенности и подводные камни.
<?php
// Способ 1: Явное приведение типа
$number = (int) "42"; // int(42)
$float = (float) "3.14"; // float(3.14)
// Способ 2: Функция intval()
$number = intval("42"); // int(42)
// Способ 3: Функция floatval() / doubleval()
$float = floatval("3.14"); // float(3.14)
// Способ 4: С помощью settype()
$str = "42";
settype($str, "integer"); // теперь $str = int(42)
?>
Все четыре метода рабочие, но ведут они себя по-разному в пограничных ситуациях. Давайте разберём каждый подробно.
1. Явное приведение типов: (int) и (float)
Самый быстрый и очевидный способ преобразовать строку в число в PHP — использовать операторы приведения типов. Они работают как "принудительное переключение" типа переменной.
Примеры с (int)
<?php
echo (int) "42"; // 42
echo (int) "3.99"; // 3 (дробная часть отбрасывается!)
echo (int) "42 яблока"; // 42 (число в начале)
echo (int) "яблоко 42"; // 0 (не может распознать число)
echo (int) ""; // 0
echo (int) null; // 0
?>
Важно: PHP пытается найти число в начале строки. Если строка начинается с букв, результатом будет 0. Это поведение часто становится причиной ошибок, особенно при работе с пользовательским вводом.
Примеры с (float)
<?php
echo (float) "3.14"; // 3.14
echo (float) "3,14"; // 3.0 (запятая не работает!)
echo (float) "2.99 евро"; // 2.99
echo (float) "абв"; // 0
?>
Лайфхак: Помните, что PHP использует точку как десятичный разделитель. Если пользователи вводят числа с запятой (как принято в России), нужно сначала заменить запятую на точку с помощью str_replace(',', '.', $str).
2. Функции intval() и floatval()
Эти функции — более "интеллектуальная" версия явного приведения. Они делают то же самое, но позволяют задать систему счисления для intval().
<?php
// intval() — преобразование в целое число
echo intval("42"); // 42
echo intval("1010", 2); // 10 (двоичная система!)
echo intval("FF", 16); // 255 (шестнадцатеричная)
echo intval("42.99"); // 42 (дробная часть отбрасывается)
// floatval() — преобразование в число с плавающей точкой
echo floatval("3.14"); // 3.14
echo floatval("2.71828"); // 2.71828
?>
Когда использовать: intval() незаменим, если вы работаете с числами в разных системах счисления (например, парсите HEX-коды цветов). Для обычных чисел разницы с (int) практически нет.
3. Функция settype(): преобразование на месте
В отличие от предыдущих методов, settype() не возвращает новое значение, а изменяет тип исходной переменной. Это может быть удобно, но требует осторожности.
<?php
$price = "19.99";
settype($price, "float");
echo $price; // 19.99 (теперь это float)
$count = "5";
settype($count, "integer");
echo $count; // 5 (теперь это int)
?>
Подводный камень: Функция возвращает true при успехе или false при неудаче. Если преобразование невозможно (например, строка "abc" в число), то переменная останется строкой, а settype() вернёт false. Всегда проверяйте результат!
<?php
$str = "не число";
if (settype($str, "integer")) {
echo "Успех: $str";
} else {
echo "Не удалось преобразовать";
}
?>
4. Неявное преобразование: PHP делает это за вас
PHP автоматически преобразует строку в число в арифметических операциях. Это может быть удобно, но часто приводит к путанице.
<?php
$result = "10" + "20"; // 30 (строки стали числами)
$result = "10" . "20"; // "1020" (конкатенация!)
$result = "10 яблок" + 5; // 15 (число из начала строки)
$result = "яблоко" + 5; // 5 (строка стала 0)
?>
Золотое правило: Никогда не полагайтесь на неявное преобразование в критических местах. Всегда используйте явное приведение типов или функции, чтобы ваш код был предсказуемым.
5. Безопасное преобразование: проверяем и валидируем
Самая большая проблема с преобразованием строки в число — это невалидные данные. Если пользователь ввёл буквы вместо цифр, все методы выше вернут 0 или 0.0. А это может быть валидным числом! Как отличить настоящий ноль от ошибочного?
Используем is_numeric()
<?php
function safeToInt($str) {
if (is_numeric($str)) {
return (int) $str;
}
return null; // или выбросить исключение
}
echo safeToInt("42"); // 42
echo safeToInt("abc"); // null
echo safeToInt(""); // null
?>
Фильтрация с filter_var()