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)
答案 0 :(得分:4)
这是一个定义问题,“为什么要完成”是一个棘手的问题,对PHP开发者来说可能更好。
但是有些信息:你可以预告一个物体,它会根据the manual显示可见的属性
PHP 5提供了一种定义对象的方法,因此可以使用例如foreach语句迭代项目列表。默认情况下,所有可见属性都将用于迭代。
is_iterable
正在检查具体事项,请参阅the manual
验证iterable是否接受变量的内容 伪类型,即它是一个实现Traversable的数组或对象
一个对象不实现Traversable
如果你自己不这样做(并且不是'其他'的东西之一,就像一个数组)所以它不是“可迭代的” “在那个意义上。
长话短说:foreach可以迭代任何可迭代的东西,但不是foreach可以迭代的所有内容都称为iterable。它是一把椅子,有四条腿,一条腿,四条腿,是一把椅子有点问题。
我会看到这样一个事实,你可以迭代一个对象而不显式实现iterable是一种例外,并留在那里。唯一的另一个问题是“他们这样做是因为”。