在 PHP 字串解析中,大括號 {} 不僅能讓變數邊界更清晰,還能解決複雜語法糖場景。本文系統整理其核心用法、常見誤區與效能優化技巧。
<?php
$test = "1變數1";
// 寫法 1:串接運算子(傳統、通用)
echo "前面有字串aa " . $test . " bb後面字串";
// 寫法 2:大括號語法(推薦,可讀性佳)
echo "前面有字串aa {$test} bb後面字串";
// 寫法 3:簡短語法(僅限簡單變數,不建議)
echo "前面有字串aa $test bb後面字串"; // 易產生歧義
?>
{$arr['key']}、{$obj->prop}、{$func()}(PHP 5.4+)等均可在大括號內執行。<?php
$user = [
'name' => '張三',
'contact' => ['email' => 'zhang@example.com', 'phone' => '0912-345678'],
'roles' => ['admin', 'editor']
];
$obj = new class {
public $status = 'active';
public function getLabel() { return 'VIP用戶'; }
};
// 陣列鍵名含特殊字元或變數
$key = 'contact';
echo "Email: {$user[$key]['email']}"; // 正確
echo "Phone: {$user['contact']['phone']}"; // 正確
// 物件屬性與方法
echo "狀態: {$obj->status}"; // 正確
echo "標籤: {$obj->getLabel()}"; // PHP 5.4+ 支援方法呼叫
// 多維陣列巢狀
$data = ['items' => [['id' => 1, 'price' => 100], ['id' => 2, 'price' => 200]]];
echo "第一項價格: {$data['items'][0]['price']}"; // 正確
?>
歷史用法:$str{0} 等同 $str[0],取得字串第一個字元。
<?php
$str = 'hello';
echo $str{0}; // 輸出 h(PHP 8.0+ 拋出 Deprecated 警告)
echo $str[0]; // 推薦寫法
?>
遷移建議:統一使用方括號 [],相容性更好且為官方推薦。
早期 PHP 版本中,isset($str{5}) 比 strlen($str) < 5 更快,因為 isset 是語言結構而非函數呼叫。但現代 PHP(7.0+)已大幅優化內建函數,兩者差異可忽略,優先考慮可讀性:
<?php
// 現代寫法:語義清晰
if (strlen($str) < 5) { /* ... */ }
// 或使用 mb_strlen 處理多位元組字串
if (mb_strlen($str, 'UTF-8') < 5) { /* ... */ }
?>
| 場景 | 推薦寫法 | 備註 |
|---|---|---|
| 簡單變數嵌入雙引號字串 | "Hello {$name}" | 加上大括號,防止後續字元干擾 |
| 陣列元素/物件屬性 | "ID: {$user['id']}" / "Name: {$obj->name}" | 必須使用大括號 |
| 複雜表達式/方法呼叫 | "Total: {$order->calculateTotal()}" | PHP 5.4+ 支援 |
| 單引號字串 | 'Hello ' . $name | 單引號不解析變數,需串接 |
| Heredoc / Nowdoc | <<<EOT ... {$var} ... EOT; | Heredoc 解析變數,Nowdoc 不解析 |
| 字串字元存取 | $str[0] | 棄用 {} 語法 |
善用大括號語法,能讓 PHP 字串模板更優雅、維護性更高。記住:雙引號裡的變數,習慣性加上 {},是專業開發者的好習慣。