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 或非整數值。