PHP 資料型別 (Data Types)
PHP 支援多種資料型別,主要分為三大類:純量型別 (Scalar)、複合型別 (Compound) 和特殊型別 (Special)。
資料型別總覽
| 分類 | 型別 | 說明 |
|---|---|---|
| 純量型別 | string | 字串 |
| int | 整數 | |
| float | 浮點數 | |
| bool | 布林值 | |
| 複合型別 | array | 陣列 |
| object | 物件 | |
| callable | 可呼叫 | |
| iterable | 可迭代 | |
| 特殊型別 | null | 空值 |
| resource | 資源 |
String (字串)
字串是一連串的字元,可以用單引號或雙引號建立:
<?php
// 單引號
$str1 = 'Hello, World!';
// 雙引號
$str2 = "Hello, World!";
// 雙引號可以解析變數
$name = "Alice";
echo "Hello, $name!"; // Hello, Alice!
echo 'Hello, $name!'; // Hello, $name!(不會解析)
// 字串長度
echo strlen($str1); // 13
// 字串連接
$greeting = "Hello" . " " . "World";
?>
Heredoc 和 Nowdoc
<?php
$name = "Alice";
// Heredoc - 類似雙引號,會解析變數
$heredoc = <<<EOT
Hello, $name!
這是多行字串
可以包含 "引號"
EOT;
// Nowdoc - 類似單引號,不會解析變數
$nowdoc = <<<'EOT'
Hello, $name!
這是多行字串
變數不會被解析
EOT;
?>
Integer (整數)
整數是沒有小數點的數字,可以是正數、負數或零:
<?php
$int1 = 123; // 正整數
$int2 = -123; // 負整數
$int3 = 0; // 零
// 不同進位
$decimal = 123; // 十進位
$octal = 0123; // 八進位 (以 0 開頭)
$hex = 0x1A; // 十六進位 (以 0x 開頭)
$binary = 0b1111; // 二進位 (以 0b 開頭)
// 整數範圍
echo PHP_INT_MAX; // 最大整數
echo PHP_INT_MIN; // 最小整數
// 檢查是否為整數
var_dump(is_int($int1)); // bool(true)
var_dump(is_int(3.14)); // bool(false)
?>
Float (浮點數)
浮點數是有小數點的數字,也稱為 double 或 real:
<?php
$float1 = 3.14;
$float2 = 3.14e2; // 314 (科學記號)
$float3 = 3.14e-2; // 0.0314
// 浮點數精度問題
$a = 0.1 + 0.2;
var_dump($a == 0.3); // bool(false) - 浮點數精度問題!
// 正確的比較方式
$epsilon = 0.00001;
var_dump(abs($a - 0.3) < $epsilon); // bool(true)
// 檢查是否為浮點數
var_dump(is_float($float1)); // bool(true)
?>
永遠不要直接比較兩個浮點數是否相等,因為浮點數的二進位表示可能會有微小的誤差。
Boolean (布林值)
布林值只有兩個值:true 和 false:
<?php
$isActive = true;
$isDeleted = false;
// 在條件中使用
if ($isActive) {
echo "啟用中";
}
// 檢查是否為布林值
var_dump(is_bool($isActive)); // bool(true)
?>
被視為 false 的值
以下值在布林運算中會被視為 false:
<?php
$values = [
false, // 布林 false
0, // 整數 0
0.0, // 浮點數 0.0
"", // 空字串
"0", // 字串 "0"
[], // 空陣列
null, // null
];
foreach ($values as $value) {
if (!$value) {
echo gettype($value) . " 被視為 false\n";
}
}
?>
Array (陣列)
陣列可以儲存多個值:
<?php
// 索引陣列
$fruits = ["apple", "banana", "orange"];
echo $fruits[0]; // apple
// 關聯陣列
$person = [
"name" => "Alice",
"age" => 25,
"city" => "Taipei"
];
echo $person["name"]; // Alice
// 多維陣列
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
echo $matrix[1][1]; // 5
// 檢查是否為陣列
var_dump(is_array($fruits)); // bool(true)
?>
更詳細的說明請參考 陣列 章節。
Object (物件)
物件是類別的實例:
<?php
class Person {
public string $name;
public int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
public function greet(): string {
return "Hello, I'm {$this->name}";
}
}
$person = new Person("Alice", 25);
echo $person->name; // Alice
echo $person->greet(); // Hello, I'm Alice
// 檢查是否為物件
var_dump(is_object($person)); // bool(true)
?>
更詳細的說明請參考 類別與物件 章節。
NULL
null 表示變數沒有值:
<?php
$var = null;
// 以下情況變數為 null
$a = null; // 明確賦值 null
$b; // 未初始化的變數
unset($c); // 被 unset 的變數
// 檢查是否為 null
var_dump(is_null($a)); // bool(true)
var_dump($a === null); // bool(true)
?>
Resource (資源)
資源是一種特殊型別,用來保存外部資源的參考,如檔案句柄、資料庫連線等:
<?php
// 檔案資源
$file = fopen("test.txt", "r");
var_dump($file); // resource(5) of type (stream)
// 資料庫連線資源 (mysqli)
$conn = mysqli_connect("localhost", "user", "pass", "db");
var_dump($conn); // object(mysqli)... (PHP 8+ 回傳物件)
// 檢查是否為資源
var_dump(is_resource($file)); // bool(true)
// 取得資源型別
echo get_resource_type($file); // stream
fclose($file);
?>
型別宣告 (PHP 7+)
PHP 7 開始支援函數參數和回傳值的型別宣告:
<?php
// 參數型別宣告
function greet(string $name): string {
return "Hello, $name!";
}
// 多種型別 (PHP 8+)
function process(int|float $number): int|float {
return $number * 2;
}
// 可為 null 的型別
function findUser(?int $id): ?User {
// ...
}
// 類別屬性型別宣告 (PHP 7.4+)
class User {
public string $name;
public int $age;
public ?string $email = null;
}
?>
嚴格模式
預設情況下 PHP 會自動轉換型別,使用嚴格模式可以禁止自動轉換:
<?php
declare(strict_types=1);
function add(int $a, int $b): int {
return $a + $b;
}
echo add(1, 2); // 3
echo add(1.5, 2.5); // TypeError: 必須是 int,不是 float
?>
檢查型別
<?php
$string = "Hello";
$int = 42;
$float = 3.14;
$bool = true;
$array = [1, 2, 3];
$null = null;
// 使用 gettype()
echo gettype($string); // string
echo gettype($int); // integer
echo gettype($float); // double
echo gettype($bool); // boolean
// 使用 is_* 函數
var_dump(is_string($string)); // bool(true)
var_dump(is_int($int)); // bool(true)
var_dump(is_float($float)); // bool(true)
var_dump(is_bool($bool)); // bool(true)
var_dump(is_array($array)); // bool(true)
var_dump(is_null($null)); // bool(true)
var_dump(is_numeric("123")); // bool(true)
var_dump(is_numeric("abc")); // bool(false)
// 使用 var_dump() 查看詳細資訊
var_dump($string); // string(5) "Hello"
var_dump($int); // int(42)
var_dump($float); // float(3.14)
?>
型別轉換
PHP 可以自動或手動轉換型別,詳細說明請參考 型別轉換 章節。
<?php
// 自動轉換
$sum = "10" + 5; // 15 (字串 "10" 自動轉為整數)
// 手動轉換 (強制轉型)
$str = (string) 123; // "123"
$int = (int) "45.67"; // 45
$float = (float) "3.14"; // 3.14
$bool = (bool) 1; // true
$array = (array) "test"; // ["test"]
?>