【发布时间】:2013-06-23 11:13:30
【问题描述】:
我在扩展 PHP DOMElements 时遇到了一个奇怪的行为:
class JavaScript extends DOMElement {
}
class JavaScriptLibrary extends DOMElement {
}
$dom = new DOMDocument();
$node = new JavaScript('script');
$dom->appendChild($node);
$node = new JavaScriptLibrary('script');
$dom->appendChild($node);
$node = new JavaScript('script');
$dom->appendChild($node);
foreach ($dom->childNodes as $childNode) {
echo get_class($childNode)."\n";
}
预期:
JavaScript
JavaScriptLibrary
JavaScript
结果:
DOMElement
DOMElement
JavaScript
这里会发生什么?
如果我这样做:
addElement($dom, new JavaScript('script'));
addElement($dom, new JavaScriptLibrary('script'));
addElement($dom, new JavaScript('script'));
function addElement($dom, $node){
$dom->appendChild($node);
}
结果是
DOMElement
DOMElement
DOMElement
如何在不使用 ->createElement 的情况下执行此操作,例如此处“How can I extend PHP DOMElement?”。
【问题讨论】:
-
看起来总是只有最后一个元素显示正确的类名
-
在第一个示例中,$node 似乎将持有引用。如果你对三个节点使用 $node1、$node2 和 $node3 就可以了。
-
但是我不知道为什么这个函数的例子不起作用。不会有参考。
-
+1 好问题。从技术上讲
DOMElementis 是正确的类名,如果你查看 PHP 手册,文档清楚地说你得到了DOMNode的子类型(但不是特别是你的子类型) .有关更多详细信息以及您可以/可以做些什么来改变它,请参阅下面的答案。