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関数内で定義されていません。2つのオプションがあります。

  1. 関数の引数の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 に答える