Приведение типов данных в PHP: методы, примеры, ошибки

Раздел: Разработка на PHP

Преобразование типов в PHP это процесс изменения типа данных переменной. Оно бывает автоматическим (неявным) и явным. В этой статье рассмотрены различные способы приведения типов, их особенности и типичные ошибки.

Основные методы преобразования типов

Как преобразовать переменную в нужный тип явно с помощью оператора приведения?

Наиболее эффективным и простым способом является явное приведение типа с помощью оператора приведения (cast). Синтаксис: (тип) $переменная. Доступны следующие типы: int, float, string, bool, array, object, unset (удаляет переменную).

$var = '123';
$int = (int) $var;
echo $int; // 123

$float = '45.67';
$int2 = (int) $float;
echo $int2; // 45 (дробная часть отбрасывается)

$bool = (bool) 'false';
echo $bool; // 1 (непустая строка true)

При приведении строки к числу PHP пытается извлечь число из начала строки. Если строка не начинается с числа, результатом будет 0.

Типичная проблема:

Приведение нечисловой строки (например, 'abc') к целому даёт 0, что может привести к неожиданным ошибкам в вычислениях. Способ решения: предварительная проверка функцией is_numeric() или использование filter_var() с флагом FILTER_VALIDATE_INT.

$str = 'abc';
if (is_numeric($str)) {
    $num = (int) $str;
} else {
    $num = 0; // или обработка ошибки
}

Как преобразовать переменную в целое число с помощью функции intval?

Функция intval() возвращает целое значение переменной. В отличие от cast, она позволяет указать основание системы счисления (по умолчанию 10).

$var = '123.45';
$int = intval($var); // 123

$hex = 'ff';
$int = intval($hex, 16); // 255

Типичная ошибка:

Передача строки, начинающейся с '0x', в intval без указания основания может привести к неверному результату (0). Всегда указывайте основание, если ожидаете шестнадцатеричные числа.

Как преобразовать переменную в число с плавающей точкой с помощью floatval?

floatval() преобразует значение в float. Работает аналогично (float).

$str = '3.14159';
$float = floatval($str); // 3.14159

Как преобразовать значение в строку с помощью strval?

strval() возвращает строковое представление переменной. Для объектов вызывается метод __toString(), если он определён.

$num = 100;
$str = strval($num); // '100'

$bool = true;
echo strval($bool); // '1'

Как преобразовать переменную к логическому типу функцией boolval?

boolval() возвращает булево значение. Правила преобразования: false дают 0, '0', '', null, пустой массив, false. Всё остальное true.

$var = 'false';
echo boolval($var); // true (непустая строка)
$var2 = '';
echo boolval($var2); // false

Как изменить тип переменной на месте с помощью settype?

Функция settype() изменяет тип переданной переменной и возвращает true при успехе. Доступные типы: 'bool', 'int', 'float', 'string', 'array', 'object', 'null'.

$var = '42';
settype($var, 'int');
echo $var; // 42, тип int

Типичная проблема:

Если преобразование невозможно (например, из массива в int), settype вернёт false, а исходное значение может стать неопределённым. Всегда проверяйте результат.

Как происходит автоматическое (неявное) приведение типов при операциях?

PHP автоматически приводит типы в выражениях, например, при сложении строки и числа. Строка преобразуется в число, если это возможно.

$sum = '10' + 20; // 30
$concat = '10' . 20; // '1020' (конкатенация)

Типичная ошибка:

Неявное приведение может дать неверный результат, если строка содержит символы, не являющиеся цифрами. Например, '10abc' + 20 даст 30 (предупреждение о некорректном формате).

Цели и случаи использования: явное приведение рекомендуется для строгого контроля типов при работе с формами, базами данных и API. Функции intval/floatval удобны для задания основания системы счисления. Неявное приведение следует избегать в критических местах, используя проверки is_numeric и filter_var.

Расширенные примеры преобразования типов с пояснениями и результатами выполнения.

Пример
// Пример 1: Приведение строки с ведущими нулями
$str = '00123';
$int = (int) $str;
echo $int; // 123
// Результат: 123 (ведущие нули игнорируются)
Пример
// Пример 2: Приведение float к int (отбрасывание, не округление)
$float = 3.99;
$int = (int) $float;
echo $int; // 3
// Сравнение с round()
echo round(3.99); // 4
Пример
// Пример 3: Приведение объекта с __toString к строке
class Product {
    private $name;
    public function __construct($name) {
        $this->name = $name;
    }
    public function __toString() {
        return 'Product: ' . $this->name;
    }
}
$product = new Product('Phone');
$str = (string) $product;
echo $str; // Product: Phone
Пример
// Пример 4: Приведение массива к объекту (stdClass)
$array = ['name' => 'John', 'age' => 30];
$obj = (object) $array;
echo $obj->name; // John
echo $obj->age;  // 30
Пример
// Пример 5: Приведение bool к строке
$true = true;
$false = false;
echo (string) $true;  // '1'
echo (string) $false; // '' (пустая строка)
Пример
// Пример 6: intval с разными основаниями
$hex = 'ff';
echo intval($hex, 16); // 255
$oct = '77';
echo intval($oct, 8);  // 63
$bin = '1010';
echo intval($bin, 2);  // 10
// Важно: строка не должна содержать посторонних символов
Пример
// Пример 7: Неявное приведение в условиях
if ('0') {
    echo 'строка "0" считается true';
} else {
    echo 'строка "0" считается false';
}
// Вывод: строка "0" считается false
Пример
// Пример 8: Приведение null
$null = null;
echo (int) $null;      // 0
echo (string) $null;   // ''
echo (bool) $null;     // false
Пример
// Пример 9: settype с недопустимым преобразованием
$var = ['a', 'b'];
$result = settype($var, 'int');
var_dump($result); // false
var_dump($var);    // массив остаётся без изменений (но может быть сброшен в некоторых версиях)
Пример
// Пример 10: Приведение resource (устаревшее, но для иллюстрации)
$handle = fopen('php://memory', 'r');
$bool = (bool) $handle;
var_dump($bool); // true (resource всегда true, если он открыт)
fclose($handle);

Преобразование типов в PHP - comments

En
преобразовать php (php)