current()
SimpleXML è un'estensione PHP con una API semplice per lavorare con documenti XML. SimpleXMLElement::current() è uno dei metodi dell'iteratore.
Introduzione
SimpleXML è un'estensione PHP che fornisce una API semplice e facile da usare per lavorare con documenti XML. Il metodo SimpleXMLIterator::current() è uno dei metodi iteratore forniti dalla classe SimpleXMLIterator. Restituisce l'oggetto SimpleXMLElement corrente durante l'iterazione. In questo articolo vedremo come utilizzare questo metodo in PHP.
Sintassi
Il metodo SimpleXMLIterator::current() restituisce l'elemento al quale punta il puntatore interno dell'iteratore. La sua firma è:
public SimpleXMLIterator::current(): SimpleXMLElementNon accetta parametri e restituisce il SimpleXMLElement (più precisamente un SimpleXMLIterator, che estende SimpleXMLElement) su cui si trova il puntatore. Se il puntatore è oltre la fine della collezione, restituisce null, motivo per cui current() viene normalmente abbinato a valid() prima dell'uso.
current() è uno dei cinque metodi che implementano l'interfaccia Iterator di PHP, insieme a rewind(), valid(), next() e key().
Come si comporta current() all'interno di un ciclo foreach
Il costrutto foreach di PHP gestisce l'iteratore automaticamente: all'inizio di ogni ciclo chiama rewind() (una sola volta), poi valid(), poi current() per popolare la variabile del ciclo e infine next() per avanzare il puntatore. Quindi quando si chiama current() all'interno del corpo di un foreach, si ottiene lo stesso elemento della variabile del ciclo — non quello successivo.
Ciò significa che current() è più utile quando si controlla il puntatore manualmente con un ciclo while, oppure quando si ha bisogno solo del primo elemento dopo un rewind().
Caricamento dell'XML
Prima di poter iterare, è necessario un SimpleXMLIterator. Ci sono due modi comuni per crearne uno:
<?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);Un errore frequente è scrivere
new SimpleXMLIterator('books.xml')aspettandosi che legga il file. Senza il flagdataIsURL, PHP analizza il testo letteralebooks.xmlcome XML e genera un errore del parser. Usaresimplexml_load_file()se si preferisce un'API in stile funzione.
Esempio: iterazione manuale con current()
Questo esempio autonomo costruisce l'iteratore da una string e lo percorre con rewind(), valid(), current() e next() in modo da vedere esattamente dove punta 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
}Output:
PHP Basics
Advanced XMLEsempio: current() all'interno di foreach
A titolo di confronto, gli stessi dati con un ciclo foreach. Qui $book contiene già l'elemento corrente, quindi una chiamata separata a current() è ridondante:
<?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";
}Output:
PHP Basics
Advanced XMLConclusione
Il metodo SimpleXMLIterator::current() restituisce l'elemento al quale punta il puntatore interno dell'iteratore ed è una parte standard dell'interfaccia Iterator di PHP, garantendo un comportamento di attraversamento coerente sui dati XML. Ricorda che foreach chiama current() per te ad ogni passaggio, quindi all'interno del corpo del ciclo restituisce l'elemento corrente anziché quello successivo. Per un controllo preciso, gestisci il puntatore manualmente con rewind(), valid() e next(), e leggi l'etichetta di posizione con key(). Per saperne di più sul parsing XML, consulta PHP SimpleXML e il parser SimpleXML.