PHP 是弱型別語言,變數型別會自動轉換,但精確控制型別對資料處理、API 介接、資料庫操作至關重要。本文系統整理三種強制轉換方式與適用場景。
| 型別關鍵字 | 別名 | 說明 |
|---|---|---|
(int) / (integer) | 整數 | 截斷小數部份 |
(float) / (double) / (real) | 浮點數 | 保留小數 |
(string) | 字串 | 標量轉字串 |
(bool) / (boolean) | 布林值 | 依 PHP 假值規則 |
(array) | 陣列 | 標量包成單元素陣列 |
(object) | 物件 | 轉為 stdClass |
(unset) | 銷毀 | 變數變為 NULL |
<?php
$num = 3.14;
$intNum = (int)$num; // 3
$floatNum = (float)$num; // 3.14
$strNum = (string)$num; // "3.14"
$boolNum = (bool)$num; // true
// 陣列轉換
$arr = [1, 2, 3];
$obj = (object)$arr; // stdClass 物件
?>
特點:語法簡潔、編譯期最佳化、不需函數呼叫開銷。
<?php
$str = "123.9abc";
$intVal = intval($str); // 123 - 截取開頭數字
$floatVal = floatval($str); // 123.9
$strVal = strval($floatVal); // "123.9"
// 進階用法
intval("0xFF", 16); // 255 - 支援進制轉換
?>
特點:intval() 支援第二參數指定進制(2/8/10/16),處理十六進位顏色值、權限位元運算非常方便。
<?php
$num = 12.8;
$result = settype($num, "int"); // $num 變為 12
var_dump($result); // bool(true)
var_dump($num); // int(12)
// 型別字串不區分大小寫
settype($var, "integer");
settype($var, "bool");
settype($var, "array");
?>
特點:直接修改原變數(傳址),回傳成功與否,適合動態型別轉換邏輯。
| 場景 | 推薦方式 | 程式碼範例 |
|---|---|---|
| GET/POST 參數轉整數 | 型別運算子 | $id = (int)$_GET['id']; |
| 表單價格轉浮點數 | 型別運算子 | $price = (float)$_POST['price']; |
| 十六進位顏色轉十進位 | intval() | $rgb = intval($hex, 16); |
| 動態型別轉換工具函數 | settype() | settype($val, $targetType); |
| 布林旗標標準化 | 型別運算子 | $flag = (bool)$input; |
<?php
(int)"123abc" // 123 - 從開頭解析至非數字
(int)"abc123" // 0 - 開頭非數字
(float)"3.14" // 3.14
(float)".5" // 0.5
(int)true // 1
(int)false // 0
(int)null // 0
?>
<?php
// 陣列轉物件
$arr = ['a' => 1, 'b' => 2];
$obj = (object)$arr;
echo $obj->a; // 1
// 物件轉陣列
$arr2 = (array)$obj; // ['a' => 1, 'b' => 2]
// 標量轉陣列
$arr3 = (array)"hello"; // [0 => "hello"]
?>
<?php
(bool)"" // false
(bool)"0" // false ⚠️ 字串 "0" 為假值
(bool)"0.0" // true ⚠️ 字串 "0.0" 為真值
(bool)[] // false
(bool)[1] // true
?>
新版本加強型別系統,建議搭配 declare(strict_types=1) 使用嚴格模式,減少隱式轉換導致的 Bug。