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
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? –
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é. –
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? –