PHP中+不能拼接字符串,因为它是算术运算符,会将字符串强制转为数字再相加(如"123"+"456"得579,"abc"+"def"得0);唯一合法字符串拼接符是.,.=为其复合赋值形式。

PHP 里只有 . 是字符串拼接运算符,+ 不行,+= 也不直接支持字符串追加(会转成数字相加)。
为什么 + 不能拼接字符串
PHP 中 + 是算术加法运算符,遇到字符串时会尝试转换为数字再相加。比如 "123" + "456" 得到 579,而 "abc" + "def" 会变成 0 + 0 = 0,完全不是拼接效果。
常见错误现象:
- 写 $a + $b 本想拼字符串,结果得到 0 或意外数字
- 调试时发现变量“消失”了,其实是被当成 0 参与了算术运算
- 字符串转数字规则:从开头读取连续数字字符,遇到非数字即停(
"123abc"→123,"abc123"→0) - 如果真要用
+,必须确认两边都是数值类型,否则行为不可控
. 和 .= 的正确用法
. 是唯一合法的字符串连接符,.= 是它的复合赋值形式,语义清晰、性能稳定。
使用场景:
- 拼接 HTML 片段、SQL 查询(注意防注入)、日志消息、路径构造等
-
$str = "Hello" . " " . "World";→"Hello World" -
$msg = "User: "; $msg .= $username; $msg .= " logged in";→ 等价于$msg = "User: " . $username . " logged in" - 多个变量拼接时,
.=在循环中比反复用.更易读(但性能差异微乎其微,PHP 8+ 已优化)
和双引号内插值的区别
双引号字符串支持变量解析(如 "Hello $name"),但它不是“运算符”,而是语法特性;而 . 是明确的连接操作,适用于任何表达式。
立即学习“PHP免费学习笔记(深入)”;
- 内插只在双引号和 heredoc 中生效,单引号里
'Hello $name'原样输出 - 复杂表达式必须用
.:比如"ID: " . ($id ?? 0)、"Price: $" . number_format($price, 2) - 函数调用、数组访问、三元运算符等无法直接内插,硬塞进去会报错或逻辑错乱
真正容易被忽略的是:拼接前没做类型检查。比如 null、false、array() 直接参与 . 运算会转成空字符串、""、"Array"——有时是预期行为,有时是 bug 根源。别依赖隐式转换,该 strval() 或判断就判断。



















