对象迭代

时间:2019-03-06 09:01:04

标签: php oop php-internals

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

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
}

我很好奇知道为什么为什么在没有实现任何接口的对象上进行迭代会导致在其可见变量上进行迭代?这项功能的用例是什么?

1 个答案:

答案 0 :(得分:3)

就您声明的类结构而言,通常是无用的或至少是不好的做法。

但是PHP还允许您在对象上动态创建属性,因此类定义并不隐含其结构。

您可以这样做:

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

然后对该对象的迭代也将返回nonExistingProperty

这是一个坏习惯,但是有可能。有时在容器上用于查看数据(据我记得,Zend 1)。

还存在一个预定义的stdClass,其目的是创建“动态对象”。例如,json_decode()函数使用它。

例如,在解码JSON文档的情况下,您可能想在不了解其结构的情况下遍历其属性(它也可能是动态的)。