6

我在哪里可以得到一些关于SPL predefined constantslikeSELF_FIRST的参考资料CHILD_FIRST?在php.net上我得到的不多(只是他们的类型)。

4

2 回答 2

20

我将概述您链接到的页面中的(一些)类常量,然后提出其他几点。

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)并陷入困境。越多越好。

于 2010-03-09T23:35:49.320 回答
3

查看http://php.net/~helly/php/ext/spl/上的SPL 文件

于 2010-03-09T22:25:33.693 回答