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 (布林值)

布林值只有兩個值:truefalse

<?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"]
?>