【问题标题】:PHP, SPL predefined constantsPHP、SPL 预定义常量
【发布时间】:2011-01-25 15:53:45
【问题描述】:

我在哪里可以获得有关SPL predefined constants 的参考资料,例如SELF_FIRST,CHILD_FIRST?在php.net 我得到的不多(只是他们的类型)。

【问题讨论】:

  • 我的猜测是这些常量被 RucursiveIterator “内部”使用。如果我可以问,您需要参考资料怎么办?
  • 没错@andreas,我看到了recursiveIterator 的一个例子,然后开始阅读SPL。在我介绍了一个很好的部分之后,我注意到我没有得到任何关于这些常量的解释(它们的含义以及如何使用它们)

标签: php reference constants spl


【解决方案1】:

我将概述(部分)来自page you linked to 的类常量,然后提出其他几点。

RecursiveIteratorIterator 迭代模式


RecursiveIteratorIterator::LEAVES_ONLY 迭代模式。 (这是默认模式。)

这种迭代模式(三种中的一种)将迭代期间可用的项目限制为只有“叶子”(将递归结构想象成一棵树,其中有一系列分支发芽其他分支,或者在没有更多分支的情况下,最后有叶子)。在数组array('a'=>array('b','c'),'d','e'=>array('f','g')) 中,叶子是bcdfg,因为它们位于末尾,因此它们不再发芽。

给出一个代码 sn-p 显示该模式的实际作用(将有一系列示例具有相同的递归数组迭代器和使用不同模式和标志的递归迭代器迭代器):

$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 中可用的所有常量:大多数类甚至没有列出它们自己的常量。但是,您可以使用 reflection 查看可用的常量。在命令行上使用 php --rc recursiveiteratoriterator | grep -i constant 之类的东西来查看 RecursiveIteratorIterator 的常量列表。

缺乏文档

PHP 手册中提供的文档(几乎)完全由志愿者编写。特别是 SPL 是一个痛处,在该区域完全符合标准之前,还有大量工作要做。如果有人想在这方面提供帮助(不确定 SO 是否会考虑这个广告?)然后联系我 (salathe@php.net) 或注册 PHP 文档邮件列表(发送空白电子邮件至 phpdoc-subscribe@lists.php .net)并陷入困境。越多越好。

【讨论】:

  • 感谢@salathe,这正是我想要的,甚至比我预期的更详细。很棒的帖子!
  • +1 很好的答案。但是 SELF_FIRST 位有错误。 // 父母优先 $rit = new RecursiveIteratorIterator($ait, RecursiveIteratorIterator::CHILD_FIRST);应该是 SELF_FIRST
【解决方案2】:

【讨论】:

  • 就像我说的,我在 php.net 上找到了预定义常量页面,但我得到的只是它们的类型
  • @kmunky:嗯,要获得它们的价值,你可以简单地使用echo RecursiveIteratorIterator::LEAVES_ONLY;
  • 好的..现在我知道它们的价值了......但我不知道它们的含义:D
  • @kmunky:RecursiveIteratorIterator 的常量将用于该类的构造函数(参见php.net/~helly/php/ext/spl/…)。在那里你可以找到这些常量的描述。 CachingIterator 的常量几乎相同。
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多