PHP整型逻辑运算怎么做 PHP中整数的布尔判断逻辑【攻略】

4次阅读

php 中整数作布尔值时非零即真、零为假;位运算按补码处理;验证整数应用 filter_var 而非 is_int 或 ctype_digit;数组键和 switch 中需防隐式转换陷阱。

PHP 整型逻辑运算怎么做 PHP 中整数的布尔判断逻辑【攻略】

PHP 里整数怎么当布尔值用

PHP 中整数直接用于 ifwhile 等判断时,只看是不是零:非零即真,零为假。这不是“转换”,而是语言内置的隐式判定规则。

  • 0-0(实际同0)→ false
  • 1-1420x1A0b101 → 全部是 true
  • 注意:0.0 是浮点数,不是整数,但它也判为 false;而 0.1 判为 true,这点容易和整数混淆
  • 类型不重要,值才重要——(int)0(string)"0"null 都在布尔上下文中为 false,但它们语义不同,后续做严格比较(===)会出问题

位运算符对负整数怎么算

PHP 的 &|^~、<code>>> 全按补码处理,32 位或 64 位取决于平台(PHP_INT_SIZE)。负数不是简单加个符号位,得按补码逻辑来。

  • -1 & 1 结果是 1(因为 -1 补码全为 1,最低位也是 1)
  • -1 >> 1 是算术右移,高位补 1,结果仍是-1;而0xFFFFFFFF >> 1(如果它是无符号大整数)行为可能不同——PHP 没有无符号整型,所有整数带符号
  • 左移负数易溢出:<code>-1 在 32 位系统上可能变成 <code>0或触发未定义行为(实际常为0),别依赖
  • 安全做法:先用 & 0xFF 等掩码截取低 8 位再运算,避免高位干扰

filter_var($x, FILTER_VALIDATE_INT) 判断是否为有效整数

别用 is_int()ctype_digit()来验证用户输入的“整数字符串”,它们要么类型太死,要么不支持负号和进制前缀。

  • is_int("123")false(字符串不是整型)
  • ctype_digit("-123")false(不认负号)
  • filter_var("0xFF", FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX)255(成功解析)
  • filter_var("12.3", FILTER_VALIDATE_INT)false(小数点不行)
  • 注意:filter_var(" 42 ", ……) 默认会 trim,但 "42abc" 会被截断成 42——加FILTER_FLAG_STRIP_LOW 没用,得配合正则或 filter_var(……, FILTER_SANITIZE_NUMBER_INT) 预处理

整型布尔判断在数组键和 switch 里的坑

数组键自动转整型,switch做松散比较,这两处最容易暴露隐式转换的副作用。

立即学习PHP 免费学习笔记(深入)”;

  • $arr = [0 => 'a', false => 'b']; → 实际只有 [0 => 'b'],因为false 转为 0 覆盖了前者
  • switch (0) {case false: ……} 会命中——case默认用 == 比较,不是===
  • 想区分 0false?必须用 === 显式判断,或改用 match 表达式(PHP 8.0+):match ($x) {0 => ……, false => ……} 支持严格匹配
  • 从数据库读出的 tinyint(1) 字段,MySQL 扩展常返回字符串 "0""1",直接丢进 if 没问题,但进 switch 就可能误匹配case 0:(因为"0" == 0

事情说清了就结束。最麻烦的是补码运算和松散比较混用的场景,比如把数据库查出的 tinyint 字段直接扔进 switch 又没意识到它可能是字符串,这种地方一踩一个准。

text=ZqhQzanResources