PHP 雙引號字串與 heredoc 語法中,變量解析規則看似簡單,實則暗藏玄機。掌握正確的界定符用法,能避免大量莫名其妙的 Bug,特別是 SQL 拼接場景。
使用 {} 界定變量名邊界:
$a = 'flower';
// 錯誤:s 被視為變量名一部分,解析為 $as
echo "She received some $as";
// 正確:{} 明確界定變量名
echo "She received some ${a}s"; // 輸出:She received some flowers
echo "She received some {$a}s"; // 推薦寫法,更清晰
echo "She received some $a" . "s";
echo "She received some " . $a . "s";
// 以上兩種雖正確,但不如 {$a}s 簡潔明瞭
{ 必須緊鄰 $(前或後),中間不能有空格echo "She received some { $a}s"; → 輸出 She received some { flower}s使用 {$expr} 界定任意複雜表達式:
echo "有效寫法:{$arr[4][3]}"; // 正確
echo "有效寫法:{$arr['foo'][3]}"; // 正確,字串鍵需加引號
echo "有效寫法:{$this->width}00"; // 正確,避免解析為 $this->width00
echo "有效寫法:{$this->value[3]->name}"; // 正確,支援鏈式
echo "有效寫法:$name: {${$name}}"; // 可變變量
echo "有效寫法:{${getName()}}"; // 函數返回值作變量名
echo "有效寫法:{${$this->getName()}}"; // 方法返回值作變量名
echo "這樣寫有效嗎:{getName()}";
// 輸出字面字串:這樣寫有效嗎:{getName()}
// 字串中 {$arr[foo][3]} 會按「非字串上下文」解析
// 即視 foo 為常量,若未定義會觸發 Notice 並假定為 'foo'
// 嚴謹寫法:
echo "有效寫法:{$arr['foo'][3]}";
error_reporting(E_ALL);
$arr = array('a','b','c','d'=>'e');
// 字串中不加引號「碰巧」能工作
echo "This is $arr[d]"; // 輸出:This is e
// 但脫離字串上下文就會報錯
echo $arr[d];
// Notice: Use of undefined constant d - assumed 'd'
// 定義常量後又「正常」了
define('f', 'd');
echo $arr[f]; // 正常輸出 e
$arr = array('a','b','c','d'=>array('e'=>'f'));
echo "This is $arr[d][e]"; // 無法正確解析!
// 必須寫成:
echo "This is {$arr['d']['e']}";
$arr = array('a','b','c','d');
echo "This is {$arr[2]}"; // 輸出 c
echo "This is {$arr['2']}"; // 輸出 c,結果相同
// PHP 弱類型特性:數字字串鍵自動轉整數
這是句法規則價值最大的實戰場景:
// 示例一:GET 參數直接嵌入
$SQL1 = "select * from table where id={$_GET['id']}";
// 示例二:物件屬性嵌入
$SQL2 = "select * from table where id={$this->id}";
// 示例三:複雜表達式
$SQL3 = "select * from users where name='{$user->getName()}' and status={$user->isActive()}";
優勢:可讀性極高、避免拼接錯誤、天然防止變量名邊界混淆。
警示:實際生產請使用預處理語句防止 SQL 注入,此處僅演示語法優雅性。
| 場景 | 推薦寫法 | 關鍵點 |
|---|---|---|
| 簡單變量 | {$var} | 緊鄰 $,無空格 |
| 變量後接字符 | {$var}suffix | 明確界定邊界 |
| 陣列/物件 | {$arr['key']}, {$obj->prop} | 字串鍵必加引號 |
| 複雜表達式 | {$func()}, {$obj->method()} | 完整包裹在 {} 內 |
養成統一使用 {$...} 的習慣,能消除 90% 的字串變量解析困擾,代碼可讀性大幅提升。