为何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,提问作者劉鎮瑲
相关产品推荐
相关产品推荐

