2010-02-15 9 views
1

J'ai essayé de comprendre comment simplexml et dom mettent à jour le XML entre les fonctions. La raison pour laquelle je demande est que le code que j'ai écrit semble fonctionner, mais sans que je doive déclarer quoi que ce soit comme global, et je suis un peu confus quant à pourquoi il fait cela.PHP SimpleXML DOM en utilisant entre les fonctions

Par exemple, j'ai ce (simplifié) Code:

<? 

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; 
} 

?> 

Pouvez-vous s'il vous plaît me aider à comprendre comment le XML est mis à jour entre les fonctions sans avoir besoin de le déclarer comme mondial? Je sais que cela semble étrange de demander quelque chose qui fonctionne, mais je dois obtenir ma tête autour :-)

Merci

Répondre

1

Vous passez une copie de l'instance d'un objet à travers chacune de vos fonctions.

Vous pouvez penser à la transmission de paramètre en partageant la même instance d'un objet pour chacune de vos fonctions, par opposition à la déclarer global.

+0

Ok intéressant, merci pour la réponse. Donc si je mets juste une partie du xml à jour, ça va s'appliquer à tout l'objet? Aussi, ai-je besoin de retun $ node dans la fonction finale, est-ce nécessaire? –

+0

Si vous mettez à jour une partie du fichier XML dans le fichier '$ filename', cela s'appliquera à l'objet. En fonction de la façon dont votre code sera utilisé dépend du moment où retourner les variables. Si vous voulez faire quelque chose avec ce '$ node', comme' echo' le '$ node' dans' updateItem', il sera 'echo' car il est retourné. –

+0

Ok génial! Donc, si je veux juste utiliser updateItem pour modifier le xml, la sauvegarde en utilisant asXML, je n'ai pas besoin de retourner quelque chose de la fonction? –

0

Vous pensez que vous ne faites que passer les nœuds que vous avez stockés dans $ product (ou autre var): vous ne l'êtes pas. Vous passez l'objet d'origine, avec certains paramètres définis sur un noeud sélectionné.

+0

Ahhh ok, donc tant que je passe quelque chose en rapport avec une partie de $ xml, ça ira? –

Questions connexes