PHP - 对象迭代


可以使用 foreach 循环来遍历 PHP 类的对象的所有公开可见成员。此功能已在 PHP 5 及更高版本中可用。当然,您可以访问实例方法中的 private 属性列表。

PHP 还定义了可用于此目的的 迭代器(Iterator)接口。

使用 foreach 循环

在下面的示例中,使用 foreach 循环列出了类的公共属性。


<?php
   class myclass {
      private $var;
      protected $var1;
      public $x, $y, $z;
      public function __construct() {
         $this->var="Hello World";
         $this->var1=array(1,2,3);
         $this->x=100;
         $this->y=200;
         $this->z=300;
      }
   }
   $obj = new myclass();
   foreach($obj as $key => $value) {
      print "$key => $value\n";
   }
?>

它将产生以下输出 -

x => 100
y => 200
z => 300

请注意,只有 public 成员可以在类外部访问。如果类包含方法,则所有成员(publicprivateprotected)都可以使用其内部的 foreach 循环遍历。

让我们在上面的 myclass 添加一个 iterate 方法。


public function iterate() {
   foreach ($this as $k=>$v) {
      if (is_array($v)) {
         var_dump($v);
         echo PHP_EOL;
      } else {
         echo "$k : $v". PHP_EOL;
      }
   }     
}

调用此实例方法可获取所有成员的列表。

它将产生以下输出 -

var : Hello World
array(3) {
   [0]=>
   int(1)
   [1]=>
   int(2)
   [2]=>
   int(3)
}
x : 100
y : 200
z : 300

使用迭代(Iterator) 接口

PHP 为外部迭代器或对象提供了 迭代(Iterator) 接口,这些迭代器或对象可以在内部自行迭代。它定义了以下需要在用户定义的类中实现的抽象方法。


interface Iterator extends Traversable {
   /* 方法 */
   public current(): mixed
   public key(): mixed
   public next(): void
   public rewind(): void
   public valid(): bool
}
  • rewind() 方法将 Iterator 倒回第一个元素。这是启动 foreach 循环时调用的第一个方法。它不会在 foreach 循环后执行。
  • current() 方法返回当前元素。
  • key() 方法在 foreach 循环的每次迭代中返回当前元素的键。
  • next() 方法在 foreach 循环的每次迭代后调用,并向前移动到下一个元素。
  • valid() 方法检查当前位置是否有效。

示例

以下示例通过实现 Iterator 接口演示了对象迭代


<?php
   class myclass implements Iterator {
      private $arr = array('a','b','c');

      public function rewind():void {
         echo "rewinding\n";
         reset($this->arr);
      }

      public function current() {
         $var = current($this->arr);
         echo "current: $var\n";
         return $var;
      }

      public function key() {
         $var = key($this->arr);
         echo "key: $var\n";
         return $var;
      }

      public function next() : void {
         $var = next($this->arr);
         echo "next: $var\n";
         # return $var;
      }

      public function valid() : bool {
         $key = key($this->arr);
         $var = ($key !== NULL && $key !== FALSE);
         echo "valid: $var\n";
         return $var;
      }
   }

   $obj = new myclass();

   foreach ($obj as $k => $v) {
      print "$k: $v\n";
   }
?>

它将产生以下输出 -

rewinding
valid: 1
current: a
key: 0
0: a
next: b
valid: 1
current: b
key: 1
1: b
next: c
valid: 1
current: c
key: 2
2: c
next: