对象迭代

Object Iteration

我知道对对象的迭代等于对 class 的可见属性进行迭代。

class MyClass
{
    public $var1 = 'value 1';
    public $var2 = 'value 2';
    public $var3 = 'value 3';

    protected $protected = 'protected var';
    private   $private   = 'private var';
}

$class = new MyClass();

foreach($class as $key => $value) {
    print "$key => $value\n"; // print all visible attributes
}

我很想知道为什么 对未实现任何接口的对象的迭代会导致对其可见变量的迭代?这种能力的用例是什么?

就您声明的 class 结构而言,它通常是无用的,或者至少是一种不好的做法。

但是 PHP 还允许您在对象上动态创建属性,因此 class 定义并未暗示其结构。

你可以这样做:

$class = new MyClass();
$class->nonExistingProperty = 123;

然后对该对象的迭代也会 return nonExistingProperty

这是一种不好的做法,但这是可能的。它有时用于视图数据的容器(据我所知是 Zend 1)。

还有一个预定义的 stdClass 旨在创建 "dynamic objects"。例如,它被 json_decode() 函数使用。

因此,例如在解码 JSON 文档的情况下,您可能希望在不知道其结构的情况下迭代其属性(它也可能是动态的)。