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:
廣告