You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何DOMNode类无getElementsByTagName方法但代码中可调用?

解惑:DOMNode变量能调用getElementsByTagName的原因

这事儿其实是PHP DOM扩展里的类型继承和实际实例类型在起作用,我来给你掰扯清楚:

  • 别被变量的“表面类型”骗了:你看到$tnode被标注为DOMNode类型,是因为DOMXpath::query()返回的DOMNodeList里的元素,在静态类型声明上是基类DOMNode,但实际运行时,当你查询的是<div>这类元素节点时,返回的实例本质是DOMElement类——它是DOMNode的子类。

  • 再说说方法的归属:getElementsByTagName()这个方法其实是定义在DOMElement类中的,DOMElement继承了DOMNode的所有属性和方法,同时还扩展了自己的专属方法(包括这个)。所以哪怕变量的“静态类型”是DOMNode,只要实际是DOMElement实例,就完全能调用这个子类方法。

  • 你可以自己验证一下,在循环里加一行代码:

    var_dump(get_class($tnode));
    

    运行后会输出string(10) "DOMElement",直接坐实了$tnode的真实类型。

  • 补充个小知识点:DOMNode是所有DOM节点的基类,不同类型的节点(元素、文本、属性、注释等)都是它的子类,每个子类都有自己的专属方法。XPath查询会根据节点的实际类型返回对应的子类实例,只是对外显示的是基类DOMNode而已。

内容的提问来源于stack exchange,提问作者劉鎮瑲

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:03:10