PHP DOMDocument类在面向对象PHP中无法使用问题求助
问题排查与解决
这个问题我之前也碰到过,核心是命名空间的作用域规则在搞鬼!你的类位于generalCrawler命名空间下,当在成员函数里直接写DOMNode时,PHP会默认在当前的generalCrawler命名空间里找这个类,但DOM系列类(包括DOMDocument、DOMNode这些)都是PHP自带的全局命名空间类,自然就找不到了。
下面给你两种简单的解决办法:
方法一:给DOM类加全局命名空间前缀
在引用DOM相关类的时候,在类名前加个反斜杠\,明确告诉PHP去全局命名空间里找它:
namespace generalCrawler; class Crawler { public function crawl() { $dom = new \DOMDocument(); // 加\指定全局空间的DOMDocument $dom->loadHTML('<html><body><p>Test</p></body></html>'); // 遍历判断节点类型时也要加\ foreach ($dom->getElementsByTagName('p') as $node) { if ($node instanceof \DOMNode) { // 这里用\DOMNode echo $node->nodeValue; } } } }
方法二:用use语句提前导入全局类
在命名空间声明之后,用use把需要的DOM类导入到当前命名空间里,之后就可以直接用类名了,代码看起来更清爽:
namespace generalCrawler; // 提前导入全局的DOMDocument和DOMNode use DOMDocument; use DOMNode; class Crawler { public function crawl() { $dom = new DOMDocument(); $dom->loadHTML('<html><body><p>Test</p></body></html>'); foreach ($dom->getElementsByTagName('p') as $node) { if ($node instanceof DOMNode) { echo $node->nodeValue; } } } }
为啥过程式代码没问题?
因为过程式代码默认处于全局命名空间下,直接写DOMNode时,PHP会自动去全局空间查找对应的类,而你的类在自定义命名空间里时,PHP会优先在当前命名空间找,所以必须显式指定全局空间或者提前导入类才行。
内容的提问来源于stack exchange,提问作者Shehny Khan
相关产品推荐
相关产品推荐

