PHP判断变量类型应优先使用is_*()系列函数而非gettype(),因其返回布尔值、语义明确;对象类型须用instanceof;需结合类型转换和filter_var处理边界情况。

PHP 判断变量类型不能只靠 gettype(),它返回字符串、不区分资源类型、对 null 和 false 也容易混淆;实际开发中更常用的是类型检查函数组合 + 严格比较。
用 is_*() 系列函数做明确类型断言
这些函数返回布尔值,语义清晰,适合条件分支和防御性编程:
-
is_string($var):只认string,"1"是 true,1是 false -
is_int($var)或is_integer($var):只认整型,1是 true,"1"、1.0都是 false -
is_float($var)或is_double($var):只认浮点数,1.0是 true,1是 false(注意:PHP 8.0+ 中is_float(1.0)为 true,但is_float(1)仍为 false) -
is_bool($var):只认true/false,"false"、0、""都不是 bool -
is_array($var):只认数组,[]是 true,new stdClass()是 false -
is_object($var):只认对象实例,new DateTime()是 true,[]是 false -
is_null($var):只认null,== null会把0、""、false都当 null,必须用=== null或is_null() -
is_resource($var):识别文件句柄、MySQL 连接等,但无法区分资源类型(如fopen()和curl_init()都返回resource)
避免 gettype() 的陷阱
gettype() 返回字符串如 "integer"、"double"、"boolean",但它有三个常见问题:
- 对
null返回"NULL"(全大写),但 PHP 关键字是小写null,容易在switch中漏掉大小写判断 - 对资源统一返回
"resource",无法知道是stream还是curl,得配合get_resource_type() - 对对象一律返回
"object",不体现类名,要获知具体类型需用get_class()或instanceof
所以除非你明确需要字符串描述(比如日志记录),否则优先用 is_*()。
立即学习“PHP免费学习笔记(深入)”;
对象类型判断:用 instanceof 而非 gettype()
判断对象是否属于某个类或接口,instanceof 是唯一可靠方式:
if ($obj instanceof DateTime) {
echo "是 DateTime 实例";
}
if ($obj instanceof JsonSerializable) {
echo "实现了 JsonSerializable 接口";
}
注意:instanceof 对 null 返回 false,不会报错;而 get_class($obj) 在 $obj 为 null 时会警告。如果不确定是否为对象,先用 is_object($obj) 再用 instanceof 更安全。
类型判断的边界情况必须手动验证
PHP 的弱类型让很多“看起来像”的值类型不同,比如:
-
"123"是 string,123是 int,123.0是 float —— 三者==为 true,但===全部为 false -
0、"0"、false、null、[]在empty()下都为 true,但类型完全不同 -
is_numeric("1e5")为 true,但is_float("1e5")为 false —— 字符串形式的科学计数法不被is_float()认可
所以涉及用户输入、JSON 解析、数据库读取等场景,不能只依赖单一函数,要结合 is_*() + filter_var($val, FILTER_VALIDATE_...) + 显式类型转换(如 (int)$val)来收口。











