PHP SimpleXML DOM, использующий между функциями - PullRequest
1 голос
/ 16 февраля 2010

Я пытался понять, как simplexml и dom обновляют XML между функциями. Причина, по которой я спрашиваю, состоит в том, что написанный мною код, похоже, работает, но без необходимости объявлять что-либо как глобальное, и я немного сбит с толку относительно того, почему это происходит.

Например, у меня есть этот (упрощенный) код:

<?

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 между функциями без необходимости объявлять его как глобальный? Я знаю, что странно спрашивать о чем-то, что работает, но мне нужно обдумать это: -)

Спасибо

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

Вы передаете копию экземпляра объекта через каждую из ваших функций.

Вы можете думать о передаче параметров как , совместно используя один и тот же экземпляр объекта для каждой из ваших функций, в отличие от объявления его global.

0 голосов
/ 16 февраля 2010

Вы думаете, что пропускаете только те узлы, которые вы сохранили в $ product (или другом var), а вы нет. Вы передаете исходный объект с некоторыми параметрами, установленными для выбранного набора узлов.

...