
php对字符串执行异或(^)运算时,会逐字符对其ascii码值进行按位异或,结果再转为对应ascii字符;"!"(33)与"@"(64)异或得97,即字符"a"。
在 PHP 中,当两个操作数均为字符串时,^(异或)运算符不会像整数那样直接作用于数值本身,而是以字符为单位,在 ASCII 码层面进行逐位异或运算。这是 PHP 特有的字符串位运算行为,由官方文档明确定义:若 &、|、^ 的两个操作数都是字符串,则运算会在组成字符串的各字符的 ASCII 值上执行,并返回一个等长的结果字符串。
以示例代码为例:
$var = ("!" ^ "@");
echo $var; // 输出:a其底层计算过程如下:
- "!" 的 ASCII 十进制值为 33,二进制表示为 0100001(7 位,实际参与运算时按字节对齐为 00100001)
- "@" 的 ASCII 十进制值为 64,二进制表示为 1000000 → 01000000
- 二者按位异或(XOR):
00100001 ← '!' (33) ^ 01000000 ← '@' (64) ------------ 01100001 = 97 (十进制) = 'a'
因此,$var 的值为单字符字符串 "a"。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意事项:
- 此行为仅适用于两个操作数同为字符串;若其中任一为整数,PHP 会尝试类型转换(可能导致意外结果,如 "!" ^ 64 会先将 "!" 转为 0 再异或);
- 若字符串长度不同,PHP 会对较短字符串循环补全(从 PHP 8.1 起已弃用该行为,建议避免);
- 实际开发中极少依赖此特性,多见于代码混淆、CTF 题目或底层协议处理,不推荐用于业务逻辑,因其可读性差且易出错。
总结:理解该现象的关键在于牢记——PHP 的字符串位运算 = ASCII 码逐字符按位运算 → 结果转回字符。掌握 ASCII 表与基本位运算,即可快速推演任意两字符异或结果。











