PHP判断变量类型应优先使用is_*()系列函数而非gettype(),因其返回布尔值、语义明确;对象类型须用instanceof;需结合类型转换和filter_var处理边界情况。
PHP 判断变量类型不能只靠 gettype(),它返回字符串、不区分资源类型、对 null 和 false 也容易混淆;实际开发中更常用的是类型检查函数组合 + 严格比较。
is_*() 系列函数做明确类型断言这些函数返回布尔值,语义清晰,适合条件分支和防御性编程:
is_string($var):只认 string,"1" 是 true,1 是 falseis_int($var) 或 is_integer($var):只认整型,1 是 true,"1"、1.0 都是 falseis_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、"" 都不是 boolis_array($var):只认数组,[] 是 true,new stdClass() 是 falseis_object($var):只认对象实例,new DateTime() 是 true,[] 是 falseis_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_*()。
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,但 === 全部为 false0、"0"、false、null、[] 在 empty() 下都为 true,但类型完全不同is_numeric("1e5") 为 true,但 is_float("1e5") 为 false —— 字符串形式的科学计数法不被 is_float() 认可所以涉及用户输入、JSON 解析、数据库读取等场景,不能只依赖单一函数,要结合 is_*() + filter_var($val, FILTER_VALIDATE_...) + 显式类型转换(如 (int)$val)来收口。