2010-02-15 23 views
1

我一直在想方設法讓函數之間的simplexml和dom更新XML。我要問的原因是我編寫的代碼似乎很有用,但是沒有我必須聲明任何東西是全局的,而且我爲什麼會這樣做有點困惑。PHP SimpleXML使用函數之間的函數

例如,我有這個(簡化)代碼:

<? 

foreach ($filenames as $filename) { 
    $xml = simplexml_load_file($filename); 
    updateXml($xml); 
    $xml->last_update = date('Y-m-d H:i:s'); 
    $xml->asXML($filename); 
} 

function updateXml($xml) { 
    //... 
    if ($data = $xml->xpath('//data/info[product_id="' . $product_data['id'] . '"]')) { 
     $parent = $data[0]->xpath("parent::*"); 
     $data = updateItem($parent[0], $product_data); 
    } else { 
     $product = addItem($xml->products, $product_data['id']); 
     $data = updateItem($product, $product_data); 
    } 
} 

function updateItem($parent, $product_data) { 

    $node = dom_import_simplexml($parent); 
    $dom = $node->ownerDocument; 

    $product = $dom->createElement('product'); 
    $node->appendChild($product); 
    $item = $dom->createElement('id', $product_data['id']); 
    $product->appendChild($item); 
    $item = $dom->createElement('name', $product_data['name']); 
    $product->appendChild($item); 
    $item = $dom->createElement('url'); 
    $product->appendChild($item); 
    $cdata = $dom->createCDATASection($product_data['url']); 
    $item->appendChild($cdata); 
    $item = $dom->createElement('price', $product_data['price']); 
    $product->appendChild($item); 

    return $node; 
} 

?> 

能否請您幫助我瞭解如何將XML被職能部門之間更新,而無需將其申報爲全球性的?我知道這似乎很奇怪,詢問一些作品,但我需要讓我的頭周圍:-)

感謝

回答

1

你傳遞一個對象實例的副本通過你的每一個功能。

您可以將參數傳遞爲共享與您的每個函數相同的對象實例,相反聲明它爲global

+0

好有趣,謝謝你的回覆。所以,如果我只更新XML的一部分,它將適用於整個對象?另外,我是否需要在最終功能中重新調用$ node,是否需要? – 2010-02-15 21:37:53

+0

如果更新'$ filename'內的xml的一部分,它將應用於該對象。取決於你的代碼的使用方式取決於何時返回變量。如果你想用'$ node'做一些事情,比如echo''updateItem'中的'$ node',它會'echo',因爲它被返回。 – 2010-02-15 21:44:03

+0

好極了!所以,如果我只想使用updateItem來修改xml,使用asXML保存,我不需要從函數返回任何東西? – 2010-02-15 21:49:19

0

你認爲你只傳遞了存儲在$ product(或其他var)中的節點:你不是。您正在傳遞原始對象,併爲所選節點集設置了一些參數。

+0

啊,好的,只要我傳回某件涉及到$ xml部分的東西,我會好嗎? – 2010-02-15 21:44:13