Settype: примеры (PHP)

Изменение типа данных переменной через settype в PHP
Раздел: Работа с переменными
settype(mixed &var, string type): bool

Описание функции settype

Функция settype() в языке PHP применяется для изменения типа переменной непосредственно на месте. Она модифицирует исходную переменную, преобразуя её значение к указанному типу. Данная функция часто используется в ситуациях, когда требуется строго задать тип данных переменной, например, при получении данных из внешних источников (таких как формы, базы данных или API), где гарантия типа важна для дальнейшей логики программы.

Аргументы функции

Функция принимает два аргумента:

  • $var (передаётся по ссылке) – переменная, тип которой необходимо изменить.
  • $type (строковый аргумент) – строка, указывающая целевой тип. Допустимые значения: "boolean" (или "bool"), "integer" (или "int"), "float" (или "double"), "string", "array", "object", "null".

Функция возвращает true в случае успешного преобразования и false в случае неудачи.

Краткие примеры использования

Преобразование к логическому типу (bool)
$value = 1;
$result = settype($value, 'bool');
var_dump($result, $value);
bool(true)
bool(true)
Преобразование к целому числу (int)
$value = '123.45';
settype($value, 'int');
echo $value;
123
Преобразование к строке (string)
$value = 456;
settype($value, 'string');
echo gettype($value);
string
Преобразование к массиву (array)
$value = 'hello';
settype($value, 'array');
print_r($value);
Array
(
    [0] => hello
)
Попытка некорректного преобразования
$value = 'test';
$result = settype($value, 'int');
echo "Результат: ".($result?'true':'false').", Значение: $value";
Результат: true, Значение: 0

Похожие функции в PHP

В PHP существует несколько альтернативных способов преобразования типов.

Явное приведение типов

Использование синтаксиса с круглыми скобками перед переменной: (int), (string), (array) и другие. Этот способ создаёт новое значение, не изменяя исходную переменную.

$original = '123';
$new = (int)$original;
echo gettype($original), ', ', gettype($new);
string, integer
Функции семейства intval, strval, floatval

Эти функции возвращают преобразованное значение, также оставляя исходную переменную без изменений. intval(), например, позволяет дополнительно указать систему счисления.

$num = '10';
$asInt = intval($num, 16); // Интерпретация как шестнадцатеричное число
echo $asInt;
16
Когда что использовать

settype() удобна, когда необходимо изменить тип существующей переменной и не требуется сохранять её исходное значение. Явное приведение типов или функции типа intval() предпочтительнее, когда нужно получить преобразованное значение, сохранив оригинальную переменную неизменной. Для строгой проверки и преобразования типов в современных версиях PHP также полезны декларации типов (type declarations) в объявлениях функций и методов.

Типичные ошибки

Передача несуществующего типа

Указание недопустимой строки типа приводит к возврату false и генерации предупреждения (warning).

$val = 5;
$res = settype($val, 'integer123');
var_dump($res);
bool(false)
Warning: settype(): Invalid type in ...
Потеря данных при преобразовании array или object в scalar

При преобразовании массива или объекта к скалярному типу (например, int или string) значение переменной становится 1 или 0, что может быть неочевидно.

$arr = [1, 2, 3];
settype($arr, 'int');
echo $arr;
1
Преобразование строк, не начинающихся с числа

При преобразовании строки, не начинающейся с числового символа, к числовому типу (int или float) значение становится 0.

$val = "abc100";
settype($val, 'int');
echo $val;
0
Ожидание, что функция вернёт преобразованное значение

Начинающие разработчики иногда путают возвращаемое значение (успех/неудача) с самим значением переменной.

$val = "5";
$newVal = settype($val, 'int'); // $newVal содержит true/false, а не число!
echo "Результат: ". $newVal;
Результат: 1

Изменения в последних версиях PHP

Функция settype() остаётся стабильной и не претерпела значительных изменений в поведении в последних основных версиях PHP (7.x, 8.x). Однако, в контексте всей системы типов PHP 8 привнесла ряд нововведений, таких как поддержка объединённых типов (union types), тип mixed, и более строгая проверка типов, которые косвенно влияют на выбор способа преобразования типов. Сама функция продолжает работать с базовыми типами, список которых не изменился.

В PHP 8.0 улучшена согласованность преобразований типов для некоторых краевых случаев (например, преобразование чисел с плавающей точкой к целым), но это внутреннее улучшение движка, а не изменение спецификации функции settype().

Расширенные примеры применения

Нормализация данных из массива POST
Пример php
// Предположим, пришло значение, которое должно быть целым числом
$postData = ['id' => '42', 'active' => '1'];

settype($postData['id'], 'int');
settype($postData['active'], 'bool');

var_dump($postData);
array(2) {
  ["id"]=>
  int(42)
  ["active"]=>
  bool(true)
}
Работа с рекурсивными структурами (осторожно)

Функция не предназначена для рекурсивного обхода массивов или объектов. Она преобразует сам массив в строку по стандартным правилам.

Пример php
$config = ['port' => '8080', 'host' => 'localhost'];
settype($config, 'string');
echo $config;
Array
Преобразование к null

При преобразовании к типу "null" переменная всегда становится null, независимо от исходного значения.

Пример php
$a = 15;
$b = [1,2];
$c = 'text';

settype($a, 'null');
settype($b, 'null');
settype($c, 'null');

var_dump($a, $b, $c);
NULL
NULL
NULL
Использование в пользовательской функции для санитизации
Пример php
function sanitizeInput(&$input, string $type) {
    if (is_array($input)) {
        foreach ($input as &$item) {
            settype($item, $type);
        }
    } else {
        settype($input, $type);
    }
}

$data = ['10', '20.5', 'thirty'];
sanitizeInput($data, 'float');
print_r($data);
Array
(
    [0] => 10
    [1] => 20.5
    [2] => 0
)
Обработка возвращаемого значения для отладки
Пример php
$variables = ["123", "12.3abc", [5], null];
$targetType = 'int';

foreach ($variables as $var) {
    $temp = $var; // Работаем с копией, чтобы не терять исходное значение
    $success = settype($temp, $targetType);
    echo "Исходное: ".json_encode($var)." -> Преобразование к $targetType: ".($success?'Успех':'Неудача').", Результат: ".json_encode($temp)."\n";
}
Исходное: "123" -> Преобразование к int: Успех, Результат: 123
Исходное: "12.3abc" -> Преобразование к int: Успех, Результат: 12
Исходное: [5] -> Преобразование к int: Успех, Результат: 1
Исходное: null -> Преобразование к int: Успех, Результат: 0

Аналоги в других языках

Settype в Python

В Python для создания объекта указанного типа используются функции-конструкторы, такие как int(), str(), bool(). Они возвращают новое значение, а не изменяют исходное, так как переменные в Python являются ссылками на объекты.

value = "123"
new_value = int(value)
print(type(new_value), new_value)
print(type(value), value)
 123
 123

Settype в Javascript

В JavaScript используется динамическая типизация, но есть операторы и функции для преобразования: Number(), String(), Boolean(). Также существуют унарный плюс + для чисел и двойное логическое НЕ !! для логического типа.

let value = "123";
let num = Number(value);
console.log(typeof num, num); // number 123
console.log(typeof value, value); // string "123"
number 123
string "123"

Settype в MySQL

В SQL запросах MySQL преобразование типов данных часто происходит неявно (casting). Для явного преобразования используются функции CAST() и CONVERT().

SELECT CAST('123' AS UNSIGNED);
123

Основное отличие PHP-функции settype() от аналогов в Python и JavaScript заключается в том, что она модифицирует саму исходную переменную, а не просто возвращает новое значение.

PHP settype function comments

En
Settype Sets the type of a variable