ArrayObject
triển khai IteratorAggregate
cho phép bạn trả lại trình lặp thay vì triển khai nó. Nó khá đơn giản. Giả sử bạn có một lớp bọc một mảng, như
class Foo
{
private $array = [1,2,3,4];
}
và bạn muốn foreach
qua một thể hiện của Foo
, như thế này:
foreach (new Foo as $bar) {
echo $bar; // outputs 1234
}
Để đạt được điều đó bạn có thể thêm các giao diện Iterator
nhưng sau đó bạn đã phải thực hiện tất cả các phương thức trong giao diện cho nhiệm vụ đơn giản của việc lặp mảng trong đối tượng. Bạn không muốn lặp lại mã đó nhiều lần bất cứ khi nào bạn cần chức năng đó, đặc biệt là vì đã có một Iterator thực hiện những gì bạn muốn. Vì vậy, thay vì thực hiện Iterator
bạn thực hiện IteratorAggregate
class Foo implements IteratorAggregate
{
private $array = [1,2,3,4];
public function getIterator()
{
return new ArrayIterator($this->array);
}
}
Bây giờ khi bạn làm foreach
PHP sẽ sử dụng Iterator trở về từ getIterator
thay vì Foo
dụ bản thân cho phép bạn để có được kết quả 1234.
Trong trường hợp ArrayObject
, điểm chỉ đơn giản là cho phép bạn foreach
so với các giá trị trong số ArrayObject
. Tất nhiên, bạn cũng có thể tự gọi số getIterator
vì nó công khai và sau đó sử dụng Iterator trả về trực tiếp.
Cũng lưu ý chữ ký ctor của ArrayObject
:
public __construct (
[ mixed $input
[, int $flags = 0
[, string $iterator_class = "ArrayIterator"
]]])
đó lưu ý mà Iterator sẽ được trả lại.
** SPL ** không phải là một lớp hay giao diện. Đó là một bộ sưu tập các giao diện và các lớp học ngắn đến mức nó là một loại thư viện nào đó. [PHP SPL] (http://www.php.net/manual/en/intro.spl.php). 'GetIterator()' không phải là hàm hoặc phương thức 'PHP' bên trong. Bạn đang sử dụng thư viện bên ngoài? –
@ciriusrob OP đang tham chiếu đến 'IteratorAggregate :: getIterator()' – Gordon
Cảm ơn @Gordon. Tôi nghĩ anh ta đang gọi 'getIterator()' bởi chính nó nhưng không phải trên giao diện 'IteratorAggregate'. Cảm ơn vì tiền hỗ trợ. –