2017-09-22 66 views
2

PHP 7.1添加了新的is_iterable函数来检查变量是否可以迭代。但是,尽管您可以遍历对象属性is_iterable为它们返回false。为什么对象被认为不可迭代,虽然他们实际上是?

这似乎是故意的,因为它被记录在案,我无法找到任何有关这个问题的PHP错误,但我不知道为什么这样做?

<?php 
$a = new stdClass(); 
$a->foo = 'bar'; 

var_dump(is_iterable($a)); 

foreach ($a as $key => $value) { 
    var_dump($key, $value); 
} 

输出

boolean false 
string 'foo' (length=3) 
string 'bar' (length=3) 

但我期待它输出

boolean true 
string 'foo' (length=3) 
string 'bar' (length=3) 

回答

3

其定义的问题,“为什么做”是一个棘手的问题,可能是更好的PHP开发人员。

但一些信息:你可以的foreach了一个对象,它会根据the manual

PHP 5条规定了定义对象,所以有可能通过一个列表进行迭代的方式展现可见性的判定的项目,例如一个foreach语句。默认情况下,所有可见的属性将用于迭代。

is_iterable正在检查具体的事情,请参阅the manual

验证一个变量的内容由可迭代 伪类型接受的,即它是一个数组或实现Traversable的一个目的

的对象不实现Traversable,如果你不这样做你自己(而不是“其他”薄薄的一本gs,就像一个数组),所以它在这个意义上不是“可迭代的”。长话短说:foreach可以遍历任何可迭代的东西,但并不是所有foreach可以迭代的东西都称为iterable。它的椅子上有4条腿,而所有4条腿是椅子有点问题。

我会看到一个事实,即你可以遍历一个对象而不显式地实现迭代是一种异常,并将其留在那。唯一的另一个原因是“他们这么做是因为”。

+2

有关PHP相关答案的正确答案...... meh¯\\ _(ツ)_ /¯。 – deceze

+0

*如果您自己不这样做,则对象不会实现Traversable *和*这是一个内部引擎接口,无法在PHP脚本中实现。*来自http://php.net/manual/en/class.traversable .PHP。僵局? –

+2

@Alex下一句:*“必须使用'IteratorAggregate'或'Iterator'。*(注意:这两个都是'Traversable'的子类...) – deceze

相关问题