2012-07-07 16 views
5

Tôi cố gắng để hiểu getIterator() là gì, tôi sẽ giải thích:ArrayObject, getIterator();

Như tôi biết getIterator là một phương pháp mà chúng ta gọi để bao gồm một Iterator bên ngoài.

Vấn đề là getIterator bao gồm phương pháp riêng của nó là các đóng trông giống như giao diện Iterator nhưng nó không thể là một giao diện có thể là lớp nhưng tôi đang cố gắng tìm kiếm nó bên trong mã nguồn SPL.php và không tìm thấy bất kỳ, có lẽ tôi đang làm cho điều này phức tạp hơn nó thực sự là, tôi sẽ được hạnh phúc nếu một số người có thể giúp tôi hiểu được nơi nó là mã nguồn SPL.php và nó là gì (lớp học, vv). Cảm ơn tất cả các bạn và chúc một ngày tốt đẹp.

+0

** 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? –

+0

@ciriusrob OP đang tham chiếu đến 'IteratorAggregate :: getIterator()' – Gordon

+0

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ợ. –

Trả lời

12

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.

+0

Tôi đang đọc Cảm ơn bạn Gordon. –

+0

Cảm ơn bạn Gordon, nếu tôi có quyền ví dụ của bạn, hàm tạo ArrayIterator là định nghĩa mảng mới và khi tôi chạy vòng lặp foreach, hành vi được tích hợp sẵn bằng cách sử dụng các phương thức ArrayIterator (current(), key(), next() cho vòng lặp foreach cơ bản, vấn đề là trong trường hợp này bạn là người định nghĩa phương thức getIterator bằng cách sử dụng các phương thức ArrayIterator nhưng khi nhìn vào lớp ArrayObject chỉ có phương thức getIterator, nhưng chúng ta không thể xem xét nội dung getIterator , php hướng dẫn sử dụng là nói "Lấy một iterator bên ngoài", nhưng tôi muốn nhìn thấy nó, nơi mà doe này iterator bên ngoài từ? –

+0

@uBlankText không chắc chắn những gì bạn đang tìm kiếm, nhưng bạn có thể kiểm tra việc triển khai ArrayObject :: getIterator tại đây: http://lxr.php.net/xref/PHP_5_4/ext/spl/spl_array.c#1277 – Gordon

Các vấn đề liên quan