最直接可靠的方式是使用 is_bool() 函数,它严格检测变量类型是否为 bool,不进行类型转换,也不依赖值的真假性;而 == true、gettype() 或真值判断均不能准确识别布尔类型。
is_bool() 判断变量是否为布尔类型PHP 中最直接、最可靠的方式就是使用内置函数 is_bool()。它只在变量的类型确实是 bool 时返回 true,

true 还是 false。
常见误用是拿 == true 或 === true 来“判断是否为布尔”,这其实是在检查值和相等性,而非类型本身:
var_dump(is_bool(true)); // bool(true)
var_dump(is_bool(false)); // bool(true)
var_dump(is_bool(1)); // bool(false)
var_dump(is_bool('true')); // bool(false)
var_dump(is_bool(null)); // bool(false)
is_bool() 是类型检测,不是真值判断1、'1'、[1] 等“看起来像真”的值误判为布尔0、''、null、[] 都不是布尔类型,只是“falsy”值gettype() 不推荐用于布尔判断gettype() 虽然能返回 "boolean",但它返回的是字符串,需要额外比对,既啰嗦又容易出错(比如大小写、空格、拼写)。
更关键的是:gettype() 在某些扩展或 SAPI 环境下可能返回非标准字符串(极少见但存在),而 is_bool() 是语言层硬编码判断,稳定可靠。
gettype($x) === 'boolean' —— 多此一举gettype() 更适合调试输出,不适合逻辑分支判断is_bool() 比字符串比较略快,虽微小但无理由舍优取劣PHP 在松散比较(==)或某些函数(如 empty()、boolval())中会隐式转成布尔值,但这完全不等于原变量是布尔类型。
例如:
$x = '0'; var_dump($x == false); // true(字符串'0'被转为 bool 后为 false) var_dump(is_bool($x)); // false($x 本质是 string) var_dump(boolval($x)); // bool(false)(只是转换结果,不改变原类型)
empty() 对 '0' 返回 true,但它不是布尔类型filter_var($x, FILTER_VALIDATE_BOOLEAN) 会尝试解析字符串为布尔,但返回的是新布尔值,不反映原变量类型zval.type,后者看运行时转换规则如果你在写函数或处理反射信息(如 IDE 提示、静态分析),需注意 PHP 的类型系统对布尔的支持边界:
bool,但仅限于声明,不提供运行时“类型元数据”访问ReflectionParameter::getType() 可返回 ReflectionNamedType,其 getName() 可能是 "bool",但这只说明声明意图,不能替代 is_bool() 对实际变量的判断$_GET 等动态值永远无法靠声明保证类型,必须用 is_bool() 实际检测真正容易被忽略的是:哪怕你写了 function foo(bool $b): bool,调用时传入 1 仍会触发自动转换,函数体内看到的 $b 是布尔值,但调用方传的原始值未必是布尔类型 —— 所以类型识别永远要落在具体变量实例上,而不是依赖声明或上下文猜测。