PHP, предопределенные константы SPL
Вопрос
где я могу получить некоторые рекомендации по 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) и застряните.Чем больше, тем веселее.
Другие советы
Взгляните на SPL-файлы в http://php.net/~helly/php/ext/spl/.