单引号字符串不解析任何变量,$name、$arr['key']等均原样输出;双引号仅支持简单变量语法,复杂表达式需用花括号包裹,如{$arr[$key.'_suffix']}。

单引号字符串根本不触发变量解析机制
PHP 的单引号字符串是纯字面量(literal),$name、$arr['key']、${var} 这些写法在单引号里全当普通字符处理,不会被识别为变量。这不是“没写对”,而是语言设计如此——单引号跳过所有插值扫描阶段。
常见错误现象:
-
'Hello $name'输出就是 Hello $name,不是 Hello Alice -
'User ID: $user->id'原样输出,对象属性完全不访问 -
'Price: $9.99'也安全输出,$ 不会引发解析尝试
双引号能解析什么、不能解析什么
双引号支持简单变量语法,但有明确边界:它只识别 $foo、$arr[key]、$obj->prop 这类结构;复杂表达式必须用花括号包裹。
容易翻车的点:
立即学习“PHP免费学习笔记(深入)”;
-
"Sum: $a + $b"→ 输出 Sum: 3 + 5,不是 Sum: 8(加法不执行) -
"{$arr[$key . '_suffix']}"✅ 正确;"$arr[$key . '_suffix']"❌ 解析失败 -
"{$obj->getInfo()['email']}"✅;"$obj->getInfo()['email']"❌ - 变量名后紧跟字母数字时必须加花括号:
"{$name}123",否则 PHP 会找变量$name123
header() 重定向里写 'Location: $url' 为什么跳转失败
这是最典型的生产环境翻车现场:header('Location: $redirectURL'); 实际发送的是字面头 Location: $redirectURL,浏览器根本收不到真实路径,服务器按字面去找文件,自然 404。
正确做法(优先选拼接):
-
header('Location: ' . $redirectURL);—— 兼容性最强,无注入风险 -
header("Location: $redirectURL");—— 仅限 $redirectURL 已过滤且不含换行/空格 - 绝对路径或完整 URL 必须保证:
/login.php或https://example.com/login,相对路径如login.php行为不可靠
什么时候非用单引号不可
性能差异微乎其微,但语义和安全性优势明显:
- SQL 字段名、固定条件值:
'created_at'、'active',避免双引号里还要转义引号 - 正则模式:
'/^[a-z]+$/i',斜杠、字母、修饰符都不需插值 - Windows 路径:
'C:\temp\file.txt'安全;双引号里\t会被当制表符 - 含美元符号的静态文本:
'Cost: $19.99',不用逃逸也不怕误解析
真正容易被忽略的是嵌套场景:HTML 属性用双引号时,里面 PHP 插值别下意识套单引号——"<a href="https://www.php.cn/link/a7944fb6f039472fce1b5ddcaf017290">"</a> 里的 $id 根本不生效,得改成 "<a href="https://www.php.cn/link/51b458b4e6ac5bfdcce31855ad2c0fec">"</a> 或拼接。



















