settype() 会根据指定的类型将变量进行转换,并直接修改原变量本身。其语法如下:
bool settype(mixed &$var, string $type)
它接收两个参数:
$var:需要转换类型的变量(必须传引用)。
$type:目标类型,可以是 "boolean"、"integer"、"float"、"string"、"array"、"object" 或 "null"。
函数返回 true 表示转换成功,false 表示失败。
$val = '';
settype($val, 'integer');
echo $val; // 输出 0
问题:空字符串被转换为 0,可能与预期逻辑不符。
$val = [1, 2, 3];
settype($val, 'string');
echo $val; // 输出 "Array"
问题:这并不会将数组元素连接成字符串,而是输出字符串 "Array"。
$val = new stdClass();
settype($val, 'integer');
// 抛出警告,不能转换
问题:复杂类型如对象,在无法转换为标量时会引发警告。
在调用 settype() 前,先确认变量的原始类型是否适合转换:
if (is_string($val)) {
settype($val, 'integer');
}
对用户输入(如 $_GET, $_POST, $_REQUEST)进行过滤和验证,确保其符合预期类型:
$age = $_GET['age'] ?? '';
if (is_numeric($age)) {
settype($age, 'integer');
}
在可能的情况下,优先使用强类型转换操作符而非 settype(),以提升代码的可读性和安全性:
$val = (int) $val;
这种方式不会影响原变量的类型,除非重新赋值,也更容易调试和跟踪。
虽然 settype() 不抛异常,但你可以封装它来增加失败处理逻辑:
function safeSetType(&$var, $type) {
$validTypes = ['boolean', 'integer', 'float', 'string', 'array', 'object', 'null'];
if (!in_array($type, $validTypes)) {
throw new InvalidArgumentException("不支持的目标类型:$type");
}
return settype($var, $type);
}
考虑一个典型的场景,从 URL 中获取分页参数:
$page = $_GET['page'] ?? 1;
if (is_numeric($page)) {
settype($page, 'integer');
} else {
$page = 1;
}
$offset = ($page - 1) * 10;
// 接下来使用该偏移量执行数据库查询
$url = "https://gitbox.net/api/posts?page=" . $page;
在这个例子中,先判断是否是数字再转换可以确保 $page 变量不会变成意外的 0 或非整数值。