PHP - 对象迭代



可以使用 foreach 循环迭代 PHP 类对象的全部公开可见成员。此功能在 PHP 5 及更高版本中可用。当然,您可以在实例方法内部访问私有属性列表。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

请注意,只有公共成员可以在类外部访问。如果类包含一个方法,则所有成员(公共、私有或受保护)都可以从内部使用 foreach 循环遍历。

让我们在上面的 myclass 中添加一个迭代方法。

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 {
   /* Methods */
   public current(): mixed
   public key(): mixed
   public next(): void
   public rewind(): void
   public valid(): bool
}
  • rewind() 方法将迭代器倒回第一个元素。这是在开始 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:
广告