使用ArrayObject与iterator_apply报错:闭包参数不足问题求助
ArrayObject使用iterator_apply触发参数错误
以下PHP代码中,ArrayObject的foreach循环可正常执行,但调用iterator_apply并传入闭包时触发错误:
$a = new ArrayObject(); $a['b'] = 10; foreach ($a as $b) { // 循环正常执行 var_dump($b); } iterator_apply($a, fn ($x) => var_dump($x)); // 无法正常工作
错误信息:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function {closure}(), 0 passed and exactly 1 expected in /in/DoaHu:8
问题原因
iterator_apply的回调函数默认不会自动传递迭代元素或迭代器本身——如果未指定第三个参数,回调会被传入0个参数,但你的闭包声明要求接收1个参数,因此触发参数数量不匹配的错误。此外,iterator_apply要求回调返回true才能继续迭代,否则循环会提前终止,这也是容易遗漏的细节。
解决方案
调整代码,通过iterator_apply的第三个参数传递迭代器实例,在回调中手动获取当前元素,并返回true维持迭代:
$a = new ArrayObject(); $a['b'] = 10; foreach ($a as $b) { var_dump($b); } // 修复后的iterator_apply调用 iterator_apply($a, function($iterator) { var_dump($iterator->current()); // 手动获取当前迭代元素 return true; // 返回true继续下一次迭代 }, [$a]); // 将迭代器作为参数传递给回调
运行这段代码会正常输出int(10),和foreach的执行结果一致。
内容的提问来源于stack exchange,提问作者Olle Härstedt
相关产品推荐
相关产品推荐

