
PHP 的 | 运算符对字符串执行逐字节按位或操作,而非字符串连接或路径分割;当 "https://www.tehplayground.com/" | "/" 时,首字符 'h'(104)与 '/'(47)按位或得 'o'(111),导致结果异常。
php 的 `|` 运算符对字符串执行逐字节按位或操作,而非字符串连接或路径分割;当 `"https://www.tehplayground.com/" | "/"` 时,首字符 `'h'`(104)与 `'/'`(47)按位或得 `'o'`(111),导致结果异常。
在 PHP 中,| 是按位或(bitwise OR)运算符,它并非专为字符串设计,但 PHP 会自动对字符串进行“隐式字节级转换”:将两个操作数按字节长度对齐(较短字符串末尾补 \0),然后对每个对应字节执行按位或运算,最终将结果字节序列重新组合为字符串。
例如:
echo 'https://www.tehplayground.com/' | '/'; // 输出:'ottps://www.tehplayground.com/'
其本质是:
- 字符串
'https://www.tehplayground.com/'长度为 32 字节; - 字符串
'/'长度为 1 字节(ASCII 值 47,二进制00101111); - PHP 将
'/'扩展为 32 字节的字符串:'/' . str_repeat("\0", 31); - 然后逐字节计算:
'h'(ASCII 104 →01101000)|'/'(47 →00101111) =01101111→ ASCII 111 →'o''t'(116 →01110100)|"\0"(0 →00000000) =01110100→'t'
后续字符同理,仅首字符被改变,其余保持不变。
⚠️ 关键注意事项:
- 这不是 bug,而是 PHP 明确定义的语言特性(见 PHP 文档:Bitwise Operators),适用于二进制安全字符串;
- 绝对不可用于字符串拼接、路径处理或文本逻辑操作——应使用
.连接符、str_replace()、parse_url()或dirname()等语义化函数; - 当操作数类型不一致(如
string | int),PHP 会尝试将整数转为等长字符串(按平台字节序填充),行为更难预测; - 调试时可用
unpack('C*', $str)查看原始字节,验证按位运算逻辑。
✅ 正确替代方案示例:
// ✅ 拼接 URL 路径
$url = 'https://www.tehplayground.com/' . 'api/v1';
// ✅ 安全截断或分割
$base = rtrim('https://www.tehplayground.com/', '/');
// ✅ 解析路径组件
$pathInfo = parse_url('https://www.tehplayground.com/', PHP_URL_PATH);
总之,| 对字符串的作用是底层字节运算,属于低阶功能,日常开发中应主动规避,优先选用语义清晰、类型安全的字符串处理函数。理解其原理有助于排查诡异输出,但绝不推荐在业务逻辑中依赖该行为。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











