为什么对象被认为是不可迭代的,尽管它们实际上是?

时间:2017-09-22 11:47:06

标签: php iterator

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)

1 个答案:

答案 0 :(得分:4)

这是一个定义问题,“为什么要完成”是一个棘手的问题,对PHP开发者来说可能更好。

但是有些信息:你可以预告一个物体,它会根据the manual显示可见的属性

  

PHP 5提供了一种定义对象的方法,因此可以使用例如foreach语句迭代项目列表。默认情况下,所有可见属性都将用于迭代。

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

  

验证iterable是否接受变量的内容   伪类型,即它是一个实现Traversable的数组或对象

一个对象实现Traversable如果你自己不这样做(并且不是'其他'的东西之一,就像一个数组)所以它不是“可迭代的” “在那个意义上。

长话短说:foreach可以迭代任何可迭代的东西,但不是foreach可以迭代的所有内容都称为iterable。它是一把椅子,有四条腿,一条腿,四条腿,是一把椅子有点问题。

我会看到这样一个事实,你可以迭代一个对象而不显式实现iterable是一种例外,并留在那里。唯一的另一个问题是“他们这样做是因为”。