Вопрос

где я могу получить некоторые рекомендации по SPL predefined constants Нравится SELF_FIRST,CHILD_FIRST ?вкл . php.net я мало что понимаю (только в их вкусе).

Это было полезно?

Решение

Я опишу (некоторые из) констант класса из страница, на которую вы ссылались затем поднимите еще несколько вопросов.

Режимы итерации RecursiveIteratorIterator


Тот самый RecursiveIteratorIterator::LEAVES_ONLY режим итерации.(Это тот самый По умолчанию режим.)

Этот режим итерации (один из трех) ограничивает элементы, доступные во время итерации, только "листьями" (представьте рекурсивную структуру как дерево с рядом ветвей, прорастающих из других ветвей, или, в случае отсутствия других ветвей, с листьями на конце).В массиве array('a'=>array('b','c'),'d','e'=>array('f','g')) листья такие b,c,d,f и g поскольку они находятся в конце, из них больше не прорастают никакие предметы.

Приведу фрагмент кода, показывающий этот режим в действии (будет серия примеров, имеющих один и тот же итератор рекурсивного массива с итератором рекурсивного итератора, использующим разные режимы и флаги):

$array = array('a'=>array('b','c'),'d','e'=>array('f','g'));
$ait   = new RecursiveArrayIterator($array);

// Only iterate over leaves
$rit   = new RecursiveIteratorIterator($ait, RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($rit as $item) {
    echo $item;
}
// Output: bcdfg

Тот самый RecursiveIteratorIterator::SELF_FIRST режим итерации.

Этот режим итерации указывает итератору, что "родительские" элементы (т.е.не листья) должны располагаться перед их дочерними элементами (если таковые имеются) при повторении.

// Parents come first
$rit   = new RecursiveIteratorIterator($ait, RecursiveIteratorIterator::SELF_FIRST);
foreach ($rit as $key => $item) {
    if (is_array($item)) echo "[$key]"; // parent
    else echo $item;                    // child
}
// Output: [a]bcd[e]fg

Тот самый RecursiveIteratorIterator::CHILD_FIRST режим итерации.

Этот режим итерации меняет местами родительские / дочерние позиции таким образом, что дочерние элементы (листья) идут первыми, за ними следует родительский элемент, как показано на:

// Children first
$rit   = new RecursiveIteratorIterator($ait, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($rit as $key => $item) {
    if (is_array($item)) echo "[$key]"; // parent
    else echo $item;                    // child
}
// Output: bc[a]dfg[e]

Другие моменты

Флаги конструктора RecursiveIteratorIterator

Это только константы для трех режимов (только листья, родительский первый или дочерний первый) перебора рекурсивных итераторов.RecursiveIteratorIterator также имеет flags аргумент, который влияет на другое поведение, например, следует ли останавливать, если дочерний объект генерирует исключение, следует ли вызывать __toString для предметов и т.д.(флаги - это CachingIterator константы, которые в равной степени недокументированы).

Другие константы SPL

Это перекликается с моим следующим пунктом.Не существует единого универсального раздела, в котором перечислялись бы все константы, доступные во всем SPL:большинство классов даже не перечисляют свои собственные константы.Однако вы можете использовать отражение чтобы взглянуть на доступные константы.В командной строке используйте что-то вроде php --rc recursiveiteratoriterator | grep -i constant чтобы просмотреть список констант RecursiveIteratorIterator.

Отсутствие документации

Документация, доступная в руководстве по PHP, написана (в значительной степени) полностью добровольцами.SPL, в частности, является больным местом, поскольку еще предстоит проделать огромный объем работы, прежде чем эта область будет приведена в форму корабля и соответствовать стандартам.Если кто-нибудь хочет помочь в этом (не уверен, сочтет ли это рекламой?) тогда свяжитесь со мной (salathe@php.net) или зарегистрируйтесь в списке рассылки документации по PHP (отправьте пустое электронное письмо по адресу phpdoc-subscribe@lists.php.net) и застряните.Чем больше, тем веселее.

Другие советы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top