use*_*841 53 php iterator type-hinting
我有很多函数要么为数组提供类型提示,要么用于is_array()
检查变量的数组.
现在我开始使用可迭代的对象.他们实施Iterator
或IteratorAggregate
.如果它们通过类型提示或经历,它们会被接受为数组is_array()
吗?
如果我必须修改我的代码,是否有一般类型is_iterable()
,或者我必须做类似的事情:
if ( is_array($var) OR $var instance_of Iterable OR $var instanceof IteratorAggregate ) { ... }
Run Code Online (Sandbox Code Playgroud)
还有哪些可迭代的接口?
Nul*_*ion 75
我认为你的意思是instanceof Iterator
,PHP没有Iterable
接口.它确实有一个Traversable
界面.Iterator
并且IteratorAggregate
两者都延伸Traversable
(和AFAIK他们是唯一这样做的).
但不,实现的对象Traversable
不会通过is_array()
检查,也没有内置is_iterable()
函数.你可以使用的支票是
function is_iterable($var) {
return (is_array($var) || $var instanceof Traversable);
}
Run Code Online (Sandbox Code Playgroud)
要清楚,所有 php对象都可以使用foreach进行迭代,但只有部分可以实现Traversable
.因此,所呈现的is_iterable
函数将不会检测到foreach可以处理的所有事物.
Bla*_*ole 27
PHP 7.1.0 引入了iterable
伪类型和is_iterable()
函数,它是专门为此目的而设计的:
这[...]提出了一种新的
iterable
伪类型.这种类型类似于callable
,接受多种类型而不是单一类型.
iterable
接受任何array
或实施的对象Traversable
.这两种类型都foreach
可以使用迭代,并且可以yield
在生成器中使用.
function foo(iterable $iterable) {
foreach ($iterable as $value) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这[...]还添加了一个
is_iterable()
返回布尔值的函数:true
如果值是可迭代的,并且iterable
伪类型将接受false
其他值.
var_dump(is_iterable([1, 2, 3])); // bool(true)
var_dump(is_iterable(new ArrayIterator([1, 2, 3]))); // bool(true)
var_dump(is_iterable((function () { yield 1; })())); // bool(true)
var_dump(is_iterable(1)); // bool(false)
var_dump(is_iterable(new stdClass())); // bool(false)
Run Code Online (Sandbox Code Playgroud)
Isa*_*aac 12
我实际上不得不为stdClass添加一个检查,因为stdClass的实例在foreach循环中起作用,但是stdClass没有实现Traversable:
function is_iterable($var) {
return (is_array($var) || $var instanceof Traversable || $var instanceof stdClass);
}
Run Code Online (Sandbox Code Playgroud)