
php对两个字符串执行异或(^)运算时,会逐字符对其ascii码值进行按位异或,结果再转换为对应ascii字符;`"!" ^ "@"` 得到 `"a"`,正是因为 ascii 33 与 64 异或后等于 97,即字符 `'a'` 的编码。
在 PHP 中,当 ^(异或)运算符的两个操作数均为字符串时,PHP 不会将其视为布尔或整型逻辑运算,而是按字符进行逐位 ASCII 码异或,并将结果重新组合为新字符串。这一行为由 PHP 官方文档明确定义:若 &、|、^ 的操作数均为字符串,则运算作用于各字符的 ASCII 值,最终返回字符串结果。
以示例代码为例:
$var = "!" ^ "@"; echo $var; // 输出:a
其底层计算过程如下:
- 字符 "!" 的 ASCII 十进制值为 33,二进制表示为 0100001(7 位,实际参与运算时按字节补齐为 8 位:00100001)
- 字符 "@" 的 ASCII 十进制值为 64,二进制表示为 1000000 → 补齐为 01000000
- 逐位异或(相同为 0,不同为 1):
00100001 ← '!' (33) ^ 01000000 ← '@' (64) ────────── 01100001 ← 结果:97(十进制)
01100001 对应十进制 97,恰好是小写字母 'a' 的 ASCII 码。因此 $var 的值为字符串 "a"。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意事项:
- 该行为仅适用于两个操作数均为字符串;若其中任一为整数,PHP 将尝试类型转换(如将字符串转为整数),可能导致意外结果(例如 "1" ^ "2" ≠ "a");
- 若字符串长度不同,PHP 会对较短字符串循环补位(PHP 8.0+ 已弃用此行为,建议避免);
- 此特性常被用于轻量级字符串混淆或简单加密(如 XOR cipher),但绝不适用于安全敏感场景——因其可逆性极强且无密钥派生机制。
总结:理解 PHP 字符串位运算的关键,在于牢记「字符串异或 = 逐字节 ASCII 异或 → 转回字符」。掌握 ASCII 码对照与二进制运算,即可准确预测此类表达式的结果。











