字符串是 PHP 中使用頻率最高的標量類型。掌握單引號、雙引號、Nowdoc/Heredoc三種定義方式的差異、變量解析規則、性能特性,能寫出更安全、高效、可維護的代碼。
| 方式 | 語法 | 變量解析 | 轉義序列 | 性能 | 適用場景 |
|---|---|---|---|---|---|
| 單引號 | 'string' | ❌ 不解析 | 僅 \' 和 \\ | ⚡ 最快 | 純靜態字符串、不含變量、追求極致性能 |
| 雙引號 | "string" | ✅ 解析變量 | 完整支持(\n \r \t \\ \$ \" 等) | 稍慢 | 需內插變量、包含換行/制表符等控制字符 |
| Heredoc | <<<EOT ... EOT; | ✅ 解析變量(同雙引號) | 同雙引號 | 同雙引號 | 大段文本、SQL 語句、HTML 模板、避免引號嵌套 |
| Nowdoc | <<<'EOT' ... EOT; | ❌ 不解析(同單引號) | 無轉義(原樣輸出) | 同單引號 | 包含大量特殊字符、代碼片段、正則表達式 |
<?php
$name = '張三';
// 1. 單引號:原樣輸出,變量不解析
echo '你好,$name'; // 輸出:你好,$name
// 2. 雙引號:解析變量
echo "你好,{$name}"; // 輸出:你好,張三
// 複雜變量需用大括號包裹
echo "{$user->name}"; // 推薦寫法
// 3. Heredoc:大段文本,行首無縮進要求
$sql = <<<SQL
SELECT * FROM users
WHERE name = '{$name}'
AND status = 1
ORDER BY created_at DESC
SQL;
// 4. Nowdoc (PHP 5.3+):標識符用單引號,行為同單引號
$regex = <<<'REGEX'
/^[\w\-\.]+@([\w\-]+\.)+[\w\-]{2,}$/
REGEX;
// $regex 保持原樣,無任何轉義或解析
?>
| 序列 | 含義 |
|---|---|
\n | 換行 (LF) |
\r | 回車 (CR) |
\t | 水平制表符 |
\\ | 反斜線 |
\$ | 美元符號(防止變量解析) |
\" | 雙引號 |
\[0-7]{1,3} | 八進制字符 |
\x[0-9A-Fa-f]{1,2} | 十六進制字符 |
;<?php
// ❌ 錯誤:結束標識符前有縮進
$str = <<<EOT
hello
EOT;
// ✅ 正確:結束標識符頂格
$str = <<<EOT
hello
EOT;
?>
'a' . $b . 'c' 更易讀、性能相近。"{$obj->method()}"、"{$arr['key']}",避免歧義。nl2br():將 \n 轉為 <br />,而非直接在雙引號中寫 <br>。<?php $str = '123'; // 字符串 $num = 123; // 整數 echo $str + 1; // 124 (字符串自動轉數字) echo $str . 1; // '1231' (字符串連接) // 數據庫 CHAR/VARCHAR 對應 PHP 字符串,無長度限制(受 memory_limit 約束) ?>
核心原則:讓代碼語義清晰表達意圖。看到單引號即知「純靜態」,雙引號即知「有變量內插」,Heredoc 即知「大段多行文本」,Nowdoc 即知「原始字面量,無任何處理」。統一團隊規範,減少認知負擔。