单引号字符串中$var不被解析,原样输出;双引号支持简单变量插值但不支持复杂表达式;heredoc类双引号、nowdoc类单引号。

单引号字符串里 $var 不会被解析
PHP 单引号字符串是字面量,所有内容原样保留,$ 符号不触发变量插值。这是和双引号最根本的区别。
常见错误现象:'Hello $name' 输出就是字面的 Hello $name,不是 Hello Alice;有人误以为加了花括号 '{$name}' 就能生效,其实照样不解析——单引号下花括号也无效。
- 使用场景:拼接 SQL 字符串(防注入前提下)、写正则模式、输出含美元符号的文本(如价格
'$9.99') - 性能影响:单引号略快,因为跳过解析阶段,但差异微乎其微,别为这点优化牺牲可读性
- 注意嵌套:单引号内不能用单引号结束字符串,否则报错
Parse error: syntax error, unexpected '',得用转义或换双引号
双引号里 $var 解析规则要记清
双引号支持变量解析,但只认“简单变量语法”:即 $foo、$arr[key]、$obj->prop 这类,不支持复杂表达式。
常见错误现象:"The sum is $a + $b" 会输出 The sum is 3 + 5,而不是 8;"$func()" 不会调用函数,而是当字面量处理。
立即学习“PHP免费学习笔记(深入)”;
- 数组键名必须是字符串或数字,
$arr[$key]可以,但$arr[$key . '_suffix']不行,得用"{$arr[$key . '_suffix']}"(注意花括号包裹整个表达式) - 对象属性访问:用
$obj->name没问题,但$obj->getInfo()['email']必须写成"{$obj->getInfo()['email']}" - 兼容性:从 PHP 7.4 起,箭头函数不能在双引号中展开,
"{$fn($x)}"仍合法,但"{$fn->call($x)}"会报错
heredoc 和 nowdoc 的行为分界线
heredoc 行为类似双引号,nowdoc 类似单引号——区别就在开头标识符是否加单引号。
常见错误现象:写 $sql = 结果变量没解析,其实是忘了 <code>SQL 后面不能有空格,也不能缩进;更隐蔽的是,nowdoc 里写 ,结果误用了双引号标识符导致意外解析。
-
heredoc支持变量、花括号表达式、甚至换行符 (但得写成,不是实际按回车) -
nowdoc完全字面量,连反斜杠转义都失效,\n就是两个字符 - 路径或配置项中混用时特别容易出错,比如写数据库 DSN:
mysql:host=localhost;dbname={$db_name}必须用heredoc,nowdoc会把{$db_name}当纯文本
该用单引号还是双引号?看这三点
不是凭感觉,而是看字符串里有没有需要解析的内容、有没有大量转义、以及团队约定。
容易踩的坑:为了“统一风格”强行把所有字符串都写成单引号,结果后面加个变量就得切双引号,反而增加维护成本;或者反过来,全用双引号,结果日志里一堆 要反复转义。
- 纯静态文本、含大量
或$:优先单引号,比如正则'/^d{3}-d{2}-d{4}$/' - 含 1–2 个变量且无复杂结构:双引号更简洁,
"User {$id} logged in" - 含变量又含大量引号或换行:直接上
heredoc,别硬撑
真正麻烦的从来不是语法本身,而是混合场景下忘记切换引号类型,或者在模板拼接里层层嵌套后搞不清哪层该解析哪层不该——这时候不如拆成变量拼接,哪怕多写一行。











