W3docs

current()

SimpleXML — расширение PHP с простым API для работы с XML-документами. Метод SimpleXMLElement::current() — один из

Введение

SimpleXML — это расширение PHP, предоставляющее простой и удобный API для работы с XML-документами. Метод SimpleXMLIterator::current() — один из методов итератора, предоставляемых классом SimpleXMLIterator. Он возвращает текущий объект SimpleXMLElement в процессе итерации. В этой статье мы рассмотрим, как использовать этот метод в PHP.

Синтаксис

Метод SimpleXMLIterator::current() возвращает элемент, на который указывает внутренний указатель итератора. Его сигнатура:

public SimpleXMLIterator::current(): SimpleXMLElement

Он не принимает параметров и возвращает SimpleXMLElement (точнее, SimpleXMLIterator, который расширяет SimpleXMLElement), на который в данный момент указывает указатель. Если указатель вышел за пределы коллекции, метод возвращает null, поэтому current() обычно используется вместе с valid() перед вызовом.

current() — один из пяти методов, реализующих интерфейс Iterator в PHP, наряду с rewind(), valid(), next() и key().

Поведение current() внутри цикла foreach

Цикл foreach в PHP управляет итератором автоматически: в начале каждого прохода он вызывает rewind() (один раз), затем valid(), затем current() для заполнения переменной цикла и, наконец, next() для продвижения указателя. Поэтому при вызове current() внутри тела foreach вы получаете тот же элемент, что и переменная цикла — а не следующий.

Это означает, что current() наиболее полезен, когда вы управляете указателем вручную с помощью цикла while, или когда вам нужен только первый элемент после вызова rewind().

Загрузка XML

Прежде чем выполнять итерацию, необходимо создать объект SimpleXMLIterator. Есть два распространённых способа сделать это:

<?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);

Распространённая ошибка — запись new SimpleXMLIterator('books.xml') в расчёте на чтение файла. Без флага dataIsURL PHP разбирает буквальный текст books.xml как XML и выбрасывает ошибку парсера. Используйте simplexml_load_file(), если предпочитаете функциональный API.

Пример: ручная итерация с current()

Этот самодостаточный пример создаёт итератор из строки и обходит его с помощью rewind(), valid(), current() и next(), чтобы наглядно показать, на что указывает 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
}

Вывод:

PHP Basics
Advanced XML

Пример: current() внутри foreach

Для сравнения — те же данные с циклом foreach. Здесь $book уже содержит текущий элемент, поэтому отдельный вызов current() является избыточным:

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

Вывод:

PHP Basics
Advanced XML

Заключение

Метод SimpleXMLIterator::current() возвращает элемент, на который указывает внутренний указатель итератора, и является стандартной частью интерфейса Iterator в PHP, обеспечивая согласованное поведение обхода XML-данных. Помните, что foreach вызывает current() за вас при каждом проходе, поэтому внутри тела цикла он возвращает текущий элемент, а не следующий. Для точного управления управляйте указателем самостоятельно с помощью rewind(), valid() и next(), а для чтения метки позиции используйте key(). Чтобы узнать больше о разборе XML, обратитесь к разделам PHP SimpleXML и SimpleXML parser.

Практика

Практика
Что возвращает SimpleXMLIterator::current()?
Что возвращает SimpleXMLIterator::current()?
Was this page helpful?