PHP функция settype(): полный обзор и примеры
Функция settype() в PHP предназначена для изменения типа переменной. В отличие от приведения типа (например, (int)$var), settype() модифицирует саму переданную переменную, а не создаёт новое значение. Синтаксис: bool settype(mixed &$var, string $type). Параметр $type может принимать значения: "bool", "int", "float", "string", "array", "object", "null". Функция возвращает true при успехе и false при ошибке.
Применение функции settype()
Самый распространённый случай - преобразование строки в число для математических операций. Например:
$value = "123.45";
settype($value, "float");
echo $value; // 123.45Php check type (проверка типа переменной в php)
123.45
Of type string is deprecated php (предупреждение об устаревании типа string в php)
После вызова settype() переменная $value становится числом с плавающей точкой. Если преобразовать в "int", дробная часть отбрасывается.
$value = "123.45";
settype($value, "int");
echo $value; // 123Php mime type (mime-типы в php)
123
Php set type (функция settype() в php)
Как преобразовать переменную в логическое значение (bool)?
Пустая строка, ноль, пустой массив и null становятся false, всё остальное - true.
$var = "";
settype($var, "bool");
var_dump($var); // bool(false)Php number type (числовые типы в php)
bool(false)
Strict type php (строгая типизация в php)
Как сделать из числа строку?
Число преобразуется в строковое представление.
$num = 256;
settype($num, "string");
echo $num; // "256"Php type int (тип int в php)
256
Php 7 types (типы данных в php 7)
Как преобразовать строку в массив?
Строка становится единственным элементом массива с индексом 0.
$str = "hello";
settype($str, "array");
print_r($str);Php return types (типы возвращаемых значений в php)
Array ( [0] => hello )
Как сделать из переменной объект?
Скалярные значения преобразуются в объект stdClass со свойством scalar.
$scalar = 42;
settype($scalar, "object");
var_dump($scalar);object(stdClass)#1 (1) { ["scalar"]=> int(42) }Как обнулить переменную, то есть сделать её null?
Вызов settype($var, "null") устанавливает значение null вне зависимости от предыдущего типа.
$value = "anything";
settype($value, "null");
var_dump($value); // NULLNULL
Типичные проблемы и ошибки
Что произойдёт, если указать неподдерживаемый тип, например "double"?
Функция вернёт false, а тип переменной не изменится. Поддерживаются только перечисленные выше семь типов.
$var = 10;
$result = settype($var, "double");
var_dump($result); // bool(false)
var_dump($var); // int(10)bool(false) int(10)
Возникает ли предупреждение, если переменная не определена?
Да, PHP выдаёт warning, так как settype() ожидает существующую переменную. Следует предварительно инициализировать переменную.
settype($undefined, "int");
// Warning: Undefined variable $undefinedWarning: Undefined variable $undefined
Как ведёт себя settype() при преобразовании объекта в целое число?
Объект без метода __toString() преобразуется в 1. Если объект реализует __toString(), то сначала вызывается этот метод, а затем полученная строка преобразуется в число.
class Test {
public function __toString() {
return "42";
}
}
$obj = new Test();
settype($obj, "int");
echo $obj; // 4242
Что происходит при преобразовании массива в строку?
Массив преобразуется в слово "Array", а также генерируется notice. Лучше избегать такого преобразования.
$arr = [1,2,3];
settype($arr, "string");
// Notice: Array to string conversionПреобразование массива строк в числа с использованием ссылки
В цикле с ссылкой можно изменить тип каждого элемента исходного массива.
$numbers = ["10", "20", "30"];
foreach ($numbers as &$value) {
settype($value, "int");
}
unset($value);
print_r($numbers);Array ( [0] => 10 [1] => 20 [2] => 30 )
Обработка входных данных из суперглобального массива
При получении параметра из $_GET полезно преобразовать его в целое число для безопасности.
if (isset($_GET['id'])) {
$id = $_GET['id'];
if (settype($id, "int")) {
echo "ID: $id";
}
}Комбинация с проверкой is_numeric
Прежде чем преобразовывать строку в число, стоит убедиться, что она числовая.
$input = "123abc";
if (is_numeric($input)) {
settype($input, "float");
} else {
$input = 0;
}
echo $input; // 00
Преобразование объекта в массив и обратно
Свойства объекта становятся элементами ассоциативного массива, и наоборот.
class User {
public $name = "John";
public $age = 30;
}
$user = new User();
settype($user, "array");
print_r($user);
// Array ( [name] => John [age] => 30 )
settype($user, "object");
echo $user->name; // JohnArray ( [name] => John [age] => 30 ) John
Изменение типа внутри функции через ссылку
Передача переменной по ссылке позволяет изменить её тип в вызывающей области видимости.
function normalize(&$value) {
settype($value, "float");
}
$price = "49.99";
normalize($price);
echo $price; // 49.9949.99
Ошибка при передаче не переменной
Константы или литералы нельзя передавать в settype, иначе возникнет фатальная ошибка.
// settype("string", "int");
// Fatal error: Cannot pass parameter 1 by referenceСравнение с приведением типов
Приведение типов не изменяет исходную переменную, в отличие от settype().
$original = "5";
$copy = (int)$original;
echo gettype($original); // string
settype($original, "int");
echo gettype($original); // integerstring integer
Преобразование null в массив и объект
Значение null становится пустым массивом или пустым объектом stdClass.
$nullVar = null;
settype($nullVar, "array");
print_r($nullVar); // Array ( )
settype($nullVar, "object");
var_dump($nullVar); // object(stdClass)#1 (0) { }Array ( ) object(stdClass)#1 (0) { }Преобразование логического значения в целое
true становится 1, false становится 0.
$flag = true;
settype($flag, "int");
echo $flag; // 11
Обработка ситуации, когда settype возвращает false
Если тип не поддерживается, следует обработать ошибку.
$var = 100;
if (!settype($var, "unknown")) {
echo "Не удалось изменить тип";
}