核心差異一覽
| 特性 | 單引號 '...' | 雙引號 "..." |
| 變數解析 | 否 | 是 |
| 跳脫序列 | 僅 \\、\' | 完整(\n、\t、\$ 等) |
| 解析速度 | 較快(無掃描開銷) | 稍慢(需掃描變數/跳脫) |
| 適用場景 | 靜態字串、大量輸出 | 需內插變數、換行、Tab |
實際輸出對比
<?php
$foo = 2;
echo "foo is $foo"; // foo is 2
echo 'foo is $foo'; // foo is $foo
echo "foo is $foo\n"; // foo is 2 (換行)
echo 'foo is $foo\n'; // foo is $foo\n (字面)
?>
複雜變數內插:花括號語法
<?php
$arr = ['a' => [1,2,3]];
echo "值: {$arr['a'][1]}"; // 正確輸出 2
// echo "值: $arr['a'][1]"; // 語法錯誤或非預期結果
?>
SQL 語句撰寫實戰
問題:單引號衝突
<?php
$name = "O'Reilly";
// 錯誤:SQL 語句中斷
$sql = "INSERT INTO users (name) VALUES ('$name')";
// 正確:跳脫單引號
$sql = "INSERT INTO users (name) VALUES ('" . addslashes($name) . "')";
// 或參數化查詢(PDO 推薦)
$stmt = $pdo->prepare("INSERT INTO users (name) VALUES (?)");
$stmt->execute([$name]);
?>
效能微基準測試
<?php
$iter = 1_000_000;
$start = microtime(true);
for ($i=0; $i<$iter; $i++) { $s = 'static string'; }
echo "單引號: " . (microtime(true)-$start) . "s\n";
$start = microtime(true);
for ($i=0; $i<$iter; $i++) { $s = "static string"; }
echo "雙引號: " . (microtime(true)-$start) . "s\n";
// 差異極微(納秒級),實務上可忽略,優先考慮可讀性
?>
最佳實踐建議
- 預設使用單引號,除非需要變數內插或跳脫序列
- SQL/HTML 模板優先用 Heredoc 或 參數化查詢
- 複雜表達式內插務必加花括號
{$expr}
- 輸出到 HTML 必經
htmlspecialchars(),與引號選擇無關