0

看我的PHP:

file = "routingConfig.xml";
global $doc;
$doc = new DOMDocument();
$doc->load( $file );

function traverseXML($ElTag, $attr = null, $arrayNum = 'all'){
    $tag = $doc->getElementsByTagName($ElTag);
    $arr = array();

    foreach($tag as $el){
        $arr[] = $el->getAttribute($attr);
    }
    if ($arrayNum == 'all'){
        return $arr;
    }else if(is_int($arrayNum)){
        return $arr[$arrayNum];
    }else{
        return "Invalid $arrayNum value: ". $arrayNum;
    }; 
}

echo traverseXML("Route", "type", 2);

XML 是:

<Routes>
  <Route type="source"></Route>
  <Route></Route>
<Routes>

返回的错误是:

Fatal error: Call to a member function getElementsByTagName() on a non-object

我不知道该怎么做?

编辑:这是正在使用的实际代码。我最初将它剥离了一点,以使其更易于阅读,但我认为我的问题与使用该功能有关。

4

2 回答 2

1

$doc变量未在您的函数内部定义。你有两个选择:

  1. $doc作为首选的函数参数之一传递。

  2. global $doc;在函数的顶部……开发人员通常会尽量避免使用全局变量。

于 2012-08-30T16:10:25.160 回答
1

您的问题是该global $doc;语句在函数之外,因此该变量$doc未在函数内部定义。

这将解决它:

// ...
function traverseXML($ElTag, $attr = null, $arrayNum = 'all') {
  global $doc;
// ...

……但是

全局变量是个坏消息。它们通常表明设计不佳。

真的,您应该$doc作为参数传入,如下所示:

function traverseXML($doc, $ElTag, $attr = null, $arrayNum = 'all'){
    $tag = $doc->getElementsByTagName($ElTag);
    $arr = array();
    foreach($tag as $el){
        $arr[] = $el->getAttribute($attr);
    }
    if ($arrayNum == 'all'){
        return $arr;
    }else if(is_int($arrayNum)){
        return $arr[$arrayNum];
    }else{
        return "Invalid $arrayNum value: ". $arrayNum;
    }; 

}

$file = "routingConfig.xml";

$doc = new DOMDocument();
$doc->load( $file );

echo traverseXML($doc, "Route", "type", 2);

尽管您可能会考虑是否需要该功能 - 如果您不在应用程序的其他任何地方使用它,您不妨这样做:

$file = "routingConfig.xml";

$ElTag = "Route";
$attr = "type";
$arrayNum = 2;

$doc = new DOMDocument();
$doc->load( $file );

$tag = $doc->getElementsByTagName($ElTag);
$arr = array();
foreach($tag as $el){
    $arr[] = $el->getAttribute($attr);
}
if ($arrayNum == 'all'){
    echo $arr;
}else if(is_int($arrayNum)){
    echo $arr[$arrayNum];
}else{
    echo "Invalid $arrayNum value: ". $arrayNum;
}; 
于 2012-08-30T16:10:33.477 回答