2009-08-11 9 views
0

データを少しだけ取り除いて続行する必要があるため、複数回コールする単一のxml解析機能があります。ここでxml解析コードを再利用するときに「致命的なエラー:再宣言できません」

は関数である。

//Parse Product ID from Product Sides 
function getProductSpecs($xml,$type) { 

    // Setup arrary 
    global $productspecs; 
    global $count; 
    $count = 0; 
    global $type_check; 
    $type_check = $type; 

    // Parse the XML 
    // Create the parser 
    if (! ($xmlparser = xml_parser_create())) 
    { 
    die ("Cannot create name list parser"); 
    } 

    // Start tag function 
    function first($parser, $name, $attribs) { 
     global $trigger; 
     if ($name == "PRODUCTSIDEID") { 
      $trigger = 1; 
     } elseif ($name == "PRODUCTID") { 
      $trigger = 1; 
     } 
    } 

    // data handler function 
    function xml($parser, $data) { 
     global $trigger; 
     global $productspecs; 
     global $count; 
     global $type_check; 
     if ($trigger == 1){ 
      if ($type_check == "sideid") { 
       $productspecs[$count]=$data; 
       $count = $count + 1; 
      } elseif ($type_check == "productid") { 
       $productspecs[$count]=$data; 
       $count = $count + 1; 
      }    
      $trigger = 0; 
     } 
    } 

    // Call the handler functions 
    xml_set_element_handler($xmlparser, "first", ""); 

    // Call the data handler 
    xml_set_character_data_handler($xmlparser, "xml"); 

    // Parse the XML data 
    xml_parse($xmlparser,$xml); 
    // Clear parser 
    xml_parser_free($xmlparser); 

    //Return the array 
    return $productspecs; 
} 

私の問題は、これが呼び出されたときに生じる:

xml_set_element_handler($xmlparser, "first", ""); 

私は再宣言のエラーを取得:

function first($parser, $name, $attribs) { 

機能のみ表示されます一度、私は問題がコールで発生すると仮定していますが、これを回避する方法があるので、私はduにする必要はありません多くのコードをplicateします。私はこれを何度も繰り返す必要があります。

ありがとうございました。

答えて

1

関数内で関数を定義すると、これにつながる可能性があります。 getProductSpecs()を実行するたびにfirst()xml()を再度宣言しようとし、PHPではすべてのユーザ関数がdeclared in a global scopeです。最良の解決策は、first()関数とxml()関数をメインgetProductSpecs()関数の外に移動することです。

別のオプションは、次のように、あなたの関数の宣言の周りを使用することです:

if (! function_exists('first')) { 
// Start tag function 
    function first($parser, $name, $attribs) { 
     global $trigger; 
     if ($name == "PRODUCTSIDEID") { 
       $trigger = 1; 
     } elseif ($name == "PRODUCTID") { 
       $trigger = 1; 
     } 
    } 
} 
+0

は、応答をありがとうございました。私はそれが私の頭の中を包んでいなかったというその効果に何かであると思った。 – techguytom