应先用 is_object() 判断是否为对象,再用 get_class() 严格比较类名是否为 'SimpleXMLElement',或组合 is_object() 与 instanceof;务必在解析后立即检查返回值是否为 false,避免将 false 当对象处理。

如何用 is_object() 和 get_class() 双重确认
单纯用 is_object($var) 不够,因为很多 XML 解析结果可能是 SimpleXMLElement,也可能是 stdClass 或其他对象。必须结合类名判断。
推荐写法是先判对象,再查类名是否为 SimpleXMLElement:
if (is_object($var) && get_class($var) === 'SimpleXMLElement') {
// 是标准 SimpleXML 对象
}-
get_class()比gettype()更可靠,后者对对象统一返回object - 注意用严格比较
===,避免字符串隐式转换导致误判(比如类名含大小写差异) - 某些扩展(如启用
libxml_disable_entity_loader(true)后)可能影响对象构造,但类名不变
为什么 instanceof SimpleXMLElement 有时失效
在 PHP 7.2+ 中,如果 XML 解析失败(如空字符串、格式错误),simplexml_load_string() 可能返回 false 而非抛异常,此时变量不是对象,instanceof 会直接报错或静默失败。
- 直接写
$var instanceof SimpleXMLElement前必须确保$var是对象,否则触发Fatal error: instanceof expects an object - 更安全的写法是包裹在
is_object()条件里:is_object($var) && $var instanceof SimpleXMLElement - 注意:
instanceof会匹配继承关系,而SimpleXMLElement没有子类,所以和get_class()效果一致,但多了类型检查开销
检测前务必排除解析失败的常见假对象
很多开发者忽略 simplexml_load_*() 的返回值可能为 false,误把 false 当作空对象处理,导致后续调用 ->children() 报 Call to a member function children() on bool 错误。
立即学习“PHP免费学习笔记(深入)”;
- 每次解析后立刻检查返回值:
$xml = simplexml_load_string($str); if ($xml === false) { /* 处理错误 */ } - 空 XML 字符串(如
''或仅空白)会导致返回false,不是空SimpleXMLElement - 用
libxml_get_errors()查看具体解析错误,比盲猜更高效
兼容性提醒:PHP 8.0+ 的 SimpleXMLElement 类名未变,但构造行为更严格
PHP 8.0 开始,SimpleXMLElement 构造函数对非法字符(如控制字符)更敏感,默认拒绝解析;同时 __toString() 行为保持一致,不影响类型检测逻辑。
- 类型检测代码无需修改,但解析环节需增加容错(如预清理 XML 字符串)
- 若项目需支持旧版 PHP(如 5.6),注意
get_class()在对象为null时会警告,务必先is_object() - 不要依赖
var_dump()输出中的 “object(SimpleXMLElement)” 文字做判断——那是调试信息,不可靠
实际写检测逻辑时,最易被跳过的一步是:没在解析后立刻验证返回值是否为 false。类型判断只是第二道防线,第一道防线永远是解析是否成功。









