Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

Lặp đối tượng (Object Iteration) trong PHP

Giới thiệu

Từ PHP 5 trở đi, có thể lặp qua danh sách tất cả các mục visible (có thể nhìn thấy) của một đối tượng. Lặp có thể thực hiện bằng vòng lặp foreach cũng như giao diện Iterator. PHP cũng cung cấp giao diện IteratorAggregate cho mục đích này.

Sử dụng vòng lặp foreach

Mặc định, foreach sẽ lặp qua tất cả thuộc tính visible (public, và protected/private nếu truy cập từ trong lớp).

Ví dụ

<?php
class myclass {
    private $var;
    protected $var1;
    public $x, $y, $z;

    public function __construct() {
        $this->var = "private variable";
        $this->var1 = TRUE;
        $this->x = 100;
        $this->y = 200;
        $this->z = 300;
    }

    public function iterate() {
        foreach ($this as $key => $value) {
            print "$key => $value\n";
        }
    }
}

$obj = new myclass();
foreach ($obj as $key => $value) {
    print "$key => $value\n";
}
echo "\n";
$obj->iterate();
?>

Kết quả

x => 100
y => 200
z => 300
var => private variable
var1 => 1
x => 100
y => 200
z => 300

Lưu ý: Khi foreach từ bên ngoài, chỉ các thuộc tính public được lặp. Khi gọi từ phương thức iterate() bên trong lớp, cả private và protected cũng được lặp.

Sử dụng giao diện Iterator

Giao diện này định nghĩa các phương thức trừu tượng sau:

abstract public current(): mixed
abstract public key(): scalar
abstract public next(): void
abstract public rewind(): void
abstract public valid(): bool
  • Iterator::current — Trả về phần tử hiện tại
  • Iterator::key — Trả về khóa của phần tử hiện tại
  • Iterator::next — Di chuyển tới phần tử tiếp theo
  • Iterator::rewind — Quay lại phần tử đầu tiên
  • Iterator::valid — Kiểm tra vị trí hiện tại có hợp lệ

Ví dụ triển khai Iterator

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

    public function rewind() {
        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() {
        $var = next($this->arr);
        echo "next: $var\n";
        return $var;
    }
    public function valid() {
        $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";
}
?>

Kết quả

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:
valid: