PHP функция settype(): полный обзор и примеры

Раздел: Основы программирования на PHP -> Типы данных в PHP

Функция 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.45

Php check type (проверка типа переменной в php)

123.45

Of type string is deprecated php (предупреждение об устаревании типа string в php)

После вызова settype() переменная $value становится числом с плавающей точкой. Если преобразовать в "int", дробная часть отбрасывается.

$value = "123.45";
settype($value, "int");
echo $value; // 123

Php 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); // NULL
NULL

Типичные проблемы и ошибки

Что произойдёт, если указать неподдерживаемый тип, например "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 $undefined
Warning: Undefined variable $undefined

Как ведёт себя settype() при преобразовании объекта в целое число?

Объект без метода __toString() преобразуется в 1. Если объект реализует __toString(), то сначала вызывается этот метод, а затем полученная строка преобразуется в число.

class Test {
    public function __toString() {
        return "42";
    }
}
$obj = new Test();
settype($obj, "int");
echo $obj; // 42
42

Что происходит при преобразовании массива в строку?

Массив преобразуется в слово "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; // 0
0

Преобразование объекта в массив и обратно

Свойства объекта становятся элементами ассоциативного массива, и наоборот.

Пример
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; // John
Array ( [name] => John [age] => 30 ) John

Изменение типа внутри функции через ссылку

Передача переменной по ссылке позволяет изменить её тип в вызывающей области видимости.

Пример
function normalize(&$value) {
    settype($value, "float");
}
$price = "49.99";
normalize($price);
echo $price; // 49.99
49.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); // integer
string 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; // 1
1

Обработка ситуации, когда settype возвращает false

Если тип не поддерживается, следует обработать ошибку.

Пример
$var = 100;
if (!settype($var, "unknown")) {
    echo "Не удалось изменить тип";
}

Функция settype() в PHP - comments

En
Php set type (php)