
用 gettype() 看变量当前类型,但结果不总是你想要的
gettype() 是最直接的函数,返回字符串如 "integer"、"Array"、"Object"。但它对资源(Resource)、NULL、未定义变量处理较粗糙——比如对未初始化变量会返回 "NULL",而非报错;对资源只返回 "resource",不告诉你具体是文件还是数据库连接。
- 对
0、""、false、null都可能误判为“空”,实际类型完全不同,别靠它做逻辑分支 - 在严格类型判断场景(如 API 参数校验),优先用更精确的函数,比如
is_int()、is_String() - 注意:php 8.0+ 对
gettype()处理never或联合类型变量无额外支持,它仍只反映运行时值类型
用 is_*() 系列函数做类型断言,安全但得写多个判断
这类函数(is_array()、is_object()、is_callable() 等)返回布尔值,语义明确、不会抛错,适合条件分支。它们比 gettype() 更可靠,尤其对 null 和伪类型(如 is_numeric())有专门处理。
-
is_null($var)比gettype($var) === "NULL"更快且语义清晰 -
is_numeric()能识别字符串数字(如"123"、"-4.5e2"),但不是类型检查——它不区分int和Float,也不拒绝"123abc"(会返回true) - PHP 8.0 引入
is_countable()、is_iterable(),覆盖了更多常见接口契约,比手动instanceof更轻量
对象类型得用 get_class() 或 gettype() + instanceof 组合
gettype() 对对象一律返回 "object",毫无区分度;get_class() 能拿到类名,但对匿名类、未实例化类或 null 会警告或失败。
- 安全写法是先
is_object($var),再get_class($var);或者直接$var instanceof SomeClass -
get_class()不支持标量或资源,传入会触发E_WARNING;get_parent_class()同理,只对对象有效 - 如果变量可能是对象或
null,用$var?->someMethod()(PHP 8.0+)比先判断类型再调用更简洁
PHP 7.4+ 类型声明和 var_dump() 调试时别混用
函数参数/返回值的类型声明(如 function foo(string $s): int)是编译期约束,不影响运行时 gettype() 结果;而 var_dump() 显示的是值+类型的组合输出,常被误当作类型检查手段。
立即学习“PHP免费学习笔记(深入)”;
-
var_dump()输出里的int(123)或string(5) "hello"是调试信息,不能解析提取——别写正则去 parse 它 - 启用严格模式(
declare(strict_types=1))后,类型不匹配会抛TypeError,此时gettype()已无机会执行 - 对于联合类型(如
string|int),运行时仍是单一值,gettype()只反映那个值的实际类型,不会告诉你“它本可以是啥”
类型判断真正麻烦的地方不在函数选哪个,而在你是否清楚自己要解决的是“这个值现在是什么”,还是“它应该是什么”——前者用 gettype() 或 is_*(),后者得靠类型声明、文档或静态分析工具。