Предустановленные константы PHP, SPL - PullRequest
6 голосов
/ 10 марта 2010

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

Ответы [ 2 ]

20 голосов
/ 10 марта 2010

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

Режимы итераций 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 рассмотрит эту рекламу?), Тогда свяжитесь со мной (salathe@php.net) или подпишитесь на список рассылки документации PHP (отправьте пустое электронное письмо по адресу phpdoc-subscribe@lists.php .net) и застрять. Чем больше, тем лучше.

3 голосов
/ 10 марта 2010
...