首页 > 解决方案 > 为什么 iterator_apply 示例中需要第三个参数

问题描述

来自http://php.net/manual/en/function.iterator-apply.php

我无法从文档中理解为什么在下面的示例中需要第三个参数,即 array($it)。

function print_caps(Iterator $iterator) {
    echo strtoupper($iterator->current()) . "\n";
    return TRUE;
}

$it = new ArrayIterator(array("Apples", "Bananas", "Cherries"));
iterator_apply($it, "print_caps", array($it));
?>

标签: php

解决方案


如果您查看第二个参数(回调)的文档,手册说:

此函数仅接收给定的参数,因此默认为空。

这是一种相当尴尬的说法,默认情况下(即如果没有第三个参数),回调将不带参数调用。

换句话说,这:

iterator_apply($some_iterator, $some_callback);

大致相当于这个:

foreach ( $some_iterator as $value ) {
    $some_callback();
}

由于回调没有传递任何参数,所以它看不到迭代器或当前值。

相反,如果您传递第三个值,则每次都会使用这些参数调用该函数,因此:

iterator_apply($some_iterator, $some_callback, [1,2,3]);

大致相当于这个:

foreach ( $some_iterator as $value ) {
    $some_callback(1,2,3);
}

因此,您正在查看的示例允许回调在每次调用时看到迭代器,方法是将其作为参数传递给回调;那是:

iterator_apply($some_iterator, $some_callback, [$some_iterator]);

大致相当于这个:

foreach ( $some_iterator as $value ) {
    $some_callback($some_iterator);
}

推荐阅读