对象迭代
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 文档的情况下,您可能希望在不知道其结构的情况下迭代其属性(它也可能是动态的)。
我知道对对象的迭代等于对 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 文档的情况下,您可能希望在不知道其结构的情况下迭代其属性(它也可能是动态的)。