PHP, SPL предопределил константы

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

6
задан kmunky 9 March 2010 в 22:20
поделиться

2 ответа

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

Режимы итерации 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, в частности, является больным местом, поскольку еще предстоит проделать огромный объем работы, прежде чем эта область будет иметь форму корабля и соответствовать стандартам. Если кто-то хочет помочь в этом (не уверен, рассмотрит ли SO эту рекламу?), Тогда свяжитесь со мной (скрыто) или зарегистрируйтесь в списке рассылки документации PHP (отправьте пустое электронное письмо на (скрыто) и застряйте в нем. Более того, тем веселее.

20
ответ дан 8 December 2019 в 05:20
поделиться
3
ответ дан 8 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: