current()
SimpleXML est une extension PHP qui fournit une API simple pour travailler avec des documents XML. La méthode SimpleXMLIterator::current() fait partie de l'interface Iterator de PHP.
Introduction
SimpleXML est une extension PHP qui fournit une API simple et facile à utiliser pour travailler avec des documents XML. La méthode SimpleXMLIterator::current() est l'une des méthodes d'itération fournies par la classe SimpleXMLIterator. Elle retourne l'objet SimpleXMLElement courant lors de l'itération. Dans cet article, nous verrons comment utiliser cette méthode en PHP.
Syntaxe
La méthode SimpleXMLIterator::current() retourne l'élément situé à la position du pointeur interne de l'itérateur. Sa signature est :
public SimpleXMLIterator::current(): SimpleXMLElementElle ne prend aucun paramètre et retourne le SimpleXMLElement (plus précisément, un SimpleXMLIterator, qui étend SimpleXMLElement) sur lequel le pointeur est actuellement positionné. Si le pointeur a dépassé la fin de la collection, elle retourne null, c'est pourquoi current() est normalement utilisée conjointement avec valid() avant son appel.
current() est l'une des cinq méthodes qui implémentent l'interface Iterator de PHP, aux côtés de rewind(), valid(), next() et key().
Comportement de current() à l'intérieur d'une boucle foreach
La boucle foreach de PHP gère l'itérateur à votre place : au début de chaque passage, elle appelle rewind() (une seule fois), puis valid(), puis current() pour renseigner la variable de boucle, et enfin next() pour avancer le pointeur. Ainsi, lorsque vous appelez current() à l'intérieur du corps d'un foreach, vous obtenez le même élément que la variable de boucle — et non le suivant.
Cela signifie que current() est plus utile lorsque vous contrôlez le pointeur manuellement avec une boucle while, ou lorsque vous n'avez besoin que du premier élément après un rewind().
Chargement du XML
Avant de pouvoir itérer, vous avez besoin d'un SimpleXMLIterator. Il existe deux façons courantes d'en créer un :
<?php
// 1. From an XML string (the default — the first argument IS the XML data):
$data = '<books><book><title>PHP Basics</title></book></books>';
$books = new SimpleXMLIterator($data);
// 2. From a file — you MUST pass the third argument `true` (dataIsURL),
// otherwise the constructor treats the string as raw XML and fails:
$books = new SimpleXMLIterator('books.xml', 0, true);Une erreur fréquente consiste à écrire
new SimpleXMLIterator('books.xml')en espérant qu'il lira le fichier. Sans le drapeaudataIsURL, PHP analyse le texte littéralbooks.xmlcomme du XML et génère une erreur d'analyse. Utilisezsimplexml_load_file()si vous préférez une API de style fonction.
Exemple : itération manuelle avec current()
Cet exemple autonome construit l'itérateur à partir d'une chaîne et le parcourt avec rewind(), valid(), current() et next() afin que vous puissiez voir exactement où pointe current() :
<?php
$data = <<<XML
<books>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</books>
XML;
$books = new SimpleXMLIterator($data);
$books->rewind(); // move pointer to the first <book>
while ($books->valid()) { // stop when current() would be null
$current = $books->current();
echo $current->title . "\n";
$books->next(); // advance the pointer
}Résultat :
PHP Basics
Advanced XMLExemple : current() à l'intérieur d'un foreach
Pour comparaison, les mêmes données avec une boucle foreach. Ici, $book contient déjà l'élément courant, donc un appel séparé à current() est redondant :
<?php
$data = '<books>'
. '<book><title>PHP Basics</title></book>'
. '<book><title>Advanced XML</title></book>'
. '</books>';
$books = new SimpleXMLIterator($data);
foreach ($books as $book) {
// $book === $books->current() at this point in the loop
echo $book->title . "\n";
}Résultat :
PHP Basics
Advanced XMLConclusion
La méthode SimpleXMLIterator::current() retourne l'élément situé à la position du pointeur interne de l'itérateur et fait partie intégrante de l'interface Iterator de PHP, offrant un comportement de parcours cohérent sur les données XML. N'oubliez pas que foreach appelle current() pour vous à chaque passage, donc à l'intérieur du corps d'une boucle, elle retourne l'élément courant et non le suivant. Pour un contrôle précis, gérez vous-même le pointeur avec rewind(), valid() et next(), et lisez l'étiquette de position avec key(). Pour en savoir plus sur l'analyse XML, consultez PHP SimpleXML et l'analyseur SimpleXML.