PHP 中單引號 '...' 與雙引號 "..." 定義字串的行為差異,是每位 PHPer 必須掌握的基礎知識。本文不僅梳理語法差別,更從 OPcode 層面解析效能本質,並給出實際開發中的最佳實踐建議。
| 特性 | 單引號 '...' | 雙引號 "..." |
|---|---|---|
| 變量解析 | 不解析,原樣輸出 | 解析變量(含複雜語法 {$var}) |
| 轉義字符 | 僅支援 \\ 和 \' | 支援完整轉義表(\n、\t、\r、\\$ 等) |
| 解析速度 | 略快(無掃描解析開銷) | 稍慢(需掃描變量與轉義) |
| 適用場景 | 純靜態字串、不含變量、追求極致效能 | 需內插變量、包含換行/製表等控制字符 |
$hello = 3; echo "hello is $hello"; // 輸出: hello is 3 echo 'hello is $hello'; // 輸出: hello is $hello echo "hello is $hello\n"; // 輸出: hello is 3 並換行 echo 'hello is $hello\n'; // 輸出: hello is $hello\n (字面 \n)
echo "This is a string"; echo 'This is a string';
編譯後均為:
ECHO 'This is a string'
結論: 無變量內插時,兩者編譯結果完全一致,運行期零差異。
echo "This is a $variable";
OPcode 序列(簡化):
INIT_STRING ~0 ADD_STRING ~0 'This' ADD_STRING ~0 ' is a ' ADD_VAR ~0 !0 ; 變量拼接 ECHO ~0
共 5 條指令完成拼接輸出。
echo "This is a " . $variable;
OPcode:
CONCAT ~0 'This is a ' !0 ECHO ~0
僅 2 條指令,效率顯著提升。
在百萬級循環中:
注意: 現代 PHP(7.4+ / 8.x)對字串優化極大,實際業務中差異微乎其微,**可讀性優先**,無需過度微優化。
"User {$user->name} logged in" 比 'User ' . $user->name . ' logged in' 更易讀。"Total: {$order->items[0]->price * $qty}"。printf/sprintf,分離邏輯與視圖。'\n' 期望換行 → 實際輸出兩字符 \ n"$arr['key']" 直接內插陣列元素 → 觸發 Notice,正確寫法 "{$arr['key']}"理解單雙引號的解析機制與 OPcode 差異,有助於寫出更符合預期、可維護性更高的代碼。實際工程中,**「語義清晰 > 微觀效能」**,遵循團隊規範、善用靜態分析工具(PHPStan/Psalm)檢查字串用法,才是長久之計。