PHP foreach遍历对象

foreach可以遍历数组,也可以遍历对象。但是默认情况下只能遍历对象的可见属性。

class User
{
    public  $name = 'salmonl';
    private $sex  = 'm';
    private $age  = 30;

    public static function getAge()
    {
        return $this->age;
    }
}

$user = new User();
var_dump($user);

foreach ($user as $key => $value) {
    echo $key, '==>', $value, PHP_EOL;
}

以上输入结果:
object(User)#1 (3) {
[“name”]=>
string(7) “salmonl”
[“sex”:”User”:private]=>
string(1) “m”
[“age”:”User”:private]=>
int(30)
}
name==>salmonl

我们可以发现只输出了public权限的属性,那么如果想输出全部属性,怎么处理呢?

通过实现Iterator接口, 用foreach来遍历对象
0、通过foreach来遍历对象的时候会自动调用Iterator接口提供的5个方法
Iterator::current — 返回当前元素
Iterator::key — 返回当前元素的键
Iterator::next — 向前移动到下一个元素
Iterator::rewind — 返回到迭代器的第一个元素
Iterator::valid — 检查当前位置是否有效

1、调用顺序: rewind/next->valid->current->key(如果是第一次就是rewind, 否则是next)。实际例子可参考官网
2、通过在相关方法中设置返回那些属性

class Test implements Iterator
{
    private $item = [
        'id'   => 1,
        'name' => 'php'
    ];

    public function __construct($item)
    {
        if (is_array($item)) {
            $this->item = $item;
        }
    }
 
    public function rewind() {
        reset($this->item);
    }
 
    public function current() {
        return current($this->item);
    }
 
    public function key() {
        return key($this->item);
    }
 
    public function next() {
        return next($this->item);
    }
 
    public function valid() {
        return ($this->current()!== false);
    }
}

//测试
$test = new Test(['php', 'golang', 'lua', 'python']);
foreach ($test as $k => $v) {
    echo $k, '=>', $v, PHP_EOL;
}

以上输出:
0=>php
1=>golang
2=>lua
3=>python

参考:
PHP手册遍历对象

发表评论

电子邮件地址不会被公开。 必填项已用*标注