PHP 雙引號字符串和 Heredoc 結構中,變量解析規則靈活但也易踩坑。掌握 簡單語法 與 複雜語法 的區別,能寫出更健壯、可讀性更強的代碼。
適用於所有 PHP 版本。當變量名與後續字符混淆時,需用 {$var} 或 ${var} 明確界定。
$a = 'flower';
// 錯誤:解析為 $as
echo "She received some $as";
// 正確:明確界定 $a
echo "She received some ${a}s";
echo "She received some {$a}s"; // 推薦寫法
注意:花括號必須緊貼 $,{ $a} 會被視為普通字符輸出 { flower}。
替代寫法(拼接字符串)雖無需花括號,但略顯冗長:
echo "She received some $a" . "s";
echo "She received some " . $a . "s";
PHP 4+ 支持。{...} 內可包含數組元素、對象屬性、方法調用、可變變量等複雜表達式。
echo "有效:{$arr[4][3]}"; // 多維數組
echo "有效:{$arr['foo'][3]}"; // 字符串鍵名必須加引號
echo "有效:{$this->width}00"; // 對象屬性
echo "有效:{$this->value[3]->name}"; // 鏈式調用
echo "有效:$name: {${$name}}"; // 可變變量
echo "有效:{${getName()}}"; // 函數返回值作變量名
echo "有效:{${$this->getName()}}"; // 方法返回值作變量名
$arr = ['a','b','c','d'=>'e'];
echo "This is $arr[d]"; // 字符串中不報錯,但實際按常量 'd' 解析
echo $arr[d]; // 非字符串中觸發 Notice: Use of undefined constant d
結論:字符串中也應始終使用 {$arr['d']},避免歧義。
$arr = ['d' => ['e'=>'f']];
echo "This is $arr[d][e]"; // 解析錯誤
echo "This is {$arr['d']['e']}"; // 正確
$arr = ['a','b','c','d'];
echo "{$arr[2]}"; // 輸出 c
echo "{$arr['2']}"; // 輸出 c,PHP 弱類型自動轉換
複雜語法在嵌入變量構建 SQL 時極其方便:
$sql1 = "select * from table where id={$_GET['id']}";
$sql2 = "select * from table where id={$this->id}";
安全提醒:實際項目請使用預處理語句防止 SQL 注入,以上僅演示語法。