
php 对两个单字符字符串执行 `^`(异或)运算时,会对其 ascii 码值进行按位异或,结果再转为对应 ascii 字符;`"!" ^ "@"` 得到 `"a"` 正是因为 33 ^ 64 = 97,而 ascii 97 对应字符 `'a'`。
在 PHP 中,当 ^(按位异或)操作符的两个操作数均为字符串时,PHP 不会将其视为整数运算,而是逐字符对齐,对每个字符的 ASCII 值执行按位异或,并将结果重新组合为字符串(PHP 官方文档明确说明:“If both operands for the &, | and ^ operators are strings, then the operation will be performed on the ASCII values of the characters…”)。
以 $var = "!" ^ "@"; 为例:
- "!" 的 ASCII 十进制值为 33,二进制表示为 0100001(7 位,实际参与运算时按字节补零至 8 位:00100001)
- "@" 的 ASCII 十进制值为 64,二进制表示为 1000000 → 补零后为 01000000
进行按位异或(相同为 0,不同为 1):
00100001 ← '!' (33) ^ 01000000 ← '@' (64) ----------- 01100001 = 97 (十进制) → ASCII 字符 'a'
因此,$var 的值为字符串 "a"。
立即学习“PHP免费学习笔记(深入)”;
✅ 补充说明与注意事项:
- 该行为仅适用于字符串类型操作数;若任一操作数为整数,PHP 将尝试类型转换(可能触发警告或意外结果),例如 (int)"!" ^ (int)"@" 会先强制转为 0 ^ 0 = 0。
- 多字符字符串会逐字符异或(短字符串会按需重复/截断,具体取决于 PHP 版本,但单字符最安全、最可预测)。
- 此特性常被用于轻量级字符串混淆、CTF 题目或某些加密原型中,但切勿用于生产环境的安全敏感逻辑(缺乏完整性校验、易受已知明文攻击)。
? 小实验验证:
掌握这一机制,不仅能解惑类似 "!" ^ "@" === "a" 的“魔法输出”,更能帮助你读懂底层字符串操作逻辑,规避隐式类型转换带来的陷阱。











