最直接可靠的方式是使用 is_object() 函数判断变量是否为对象,它仅在变量类型为 object 时返回 true,对 null、数组、字符串、资源、闭包等均返回 false;instanceof 不能替代类型检测,否则可能触发致命错误。

用 is_object() 判断变量是否为对象
最直接、最可靠的方式就是调用 PHP 内置函数 is_object()。它只在变量是 object 类型时返回 true,其他任何类型(包括 null、array、string、未实例化的类名字符串)都返回 false。
注意:该函数不关心对象的具体类,只检测类型本身。
- 对已实例化的对象(如
$obj = new StdClass();)返回true - 对
null、空数组[]、字符串"stdClass"均返回false - 对资源(resource)、闭包(Closure)也返回
false—— 它们虽是特殊类型,但不是 object
别误用 instanceof 替代类型检测
instanceof 是用来检查对象是否属于某个类或其子类的,不是通用的对象类型判断工具。如果变量可能是 null 或非对象,直接用 instanceof 会触发致命错误:Fatal error: Uncaught Error: Instanceof expects an object。
- ✅ 正确用法:
if (is_object($var) && $var instanceof DateTime) { ... } - ❌ 危险写法:
if ($var instanceof DateTime) { ... }(当$var是null或数组时崩溃) -
instanceof对字符串类名(如"DateTime")也无效,它只接受变量
慎用 gettype() 和 get_class()
gettype() 返回类型字符串,可用于调试,但不适合逻辑判断 —— 它对对象返回 "object",看似可用,但性能略差且语义不如 is_object() 明确;get_class() 更危险:传入非对象会警告并返回 false,不能作为类型检测依据。
立即学习“PHP免费学习笔记(深入)”;
-
gettype($var) === "object"能工作,但没必要绕远路 -
get_class($var)在$var不是对象时抛出Warning: get_class() expects parameter 1 to be object - 若需后续获取类名,应先用
is_object()守住边界,再调用get_class()
对象与可调用对象(如 Closure)容易混淆
PHP 中 Closure 是对象,所以 is_object() 对闭包返回 true,但它不是“常规对象”——没有属性、不能用 -> 访问任意方法。如果你要区分“普通对象”和“可调用对象”,需额外判断:
-
is_object($var) && is_callable($var)可筛出闭包或实现了__invoke()的对象 - 想排除闭包?可加
!($var instanceof Closure) - 注意:某些扩展类(如
mysqli)也是对象,但行为更接近资源,需结合文档看实际能力
is_object() 检查,也能避开多数“Trying to get property of non-object”类报错。










