Hướng dẫn dùng iterable meaning trong PHP

Lặp lại trong PHP hướng đối tượng – PHP Iterables

Lặp lại ta có thể coi là một kiểu giả trong PHP. Nó chấp nhận bất kỳ mảng hoặc đối tượng nào triển khai giao diện Traversable. Cả hai loại này đề có thể lặp lại bằng cách sử dụng foreach và có thể sử dụng năng suất từ bên trong trình tạo. Nó có thể sử dụng làm kiểu dữ liệu cho đối số của hàm và giá trị trả về của hàm.

2. Sử dụng Iterables

Ta có thể sử dụng Iterables như một kiểu tham số để chỉ ra rằng một hàm yêu cầu một bộ giá trị, nhưng không quan tâm đến hình thức của bộ giá trị vì nó sẽ được sử dụng với foreach. Nếu một giá trị không phải làm một mảng hoặc bản sao của Traversable, một lỗi sẽ được hiển thị ra.

Ví dụ:

Sử dụng đối số hàm có thể lặp lại:

Trả lại một tệp có thể lặp lại:

Có thể lặp lại cũng có thể được sử dụng như một kiểu trả về để cho biết một hàm sẽ trả về một giá trị có thể lặp lại. Nếu giá trị trả về không phải là một mảng hoặc bản sao của Traversable , lỗi sẽ xảy ra.

Kiểu trả về có thể lặp lại:

Kiểu trả về của trình tạo có thể lặp lại:

3. Tạo lặp lại

Mảng: tất cả các mảng đều có thể lặp lại , vì vậy bất kỳ mảng nào cũng có thể được sử dụng làm đối số của một hàm yêu cầu có thể lặp lại.

Trình lặp lại: bất kỳ đối tượng nào triển khai giao diện Iterator đều có thể được sử dụng làm đối số của một hàm yêu cầu lặp lại.

Một trình lặp chứa danh sách các mục và cung cấp các phương thức để lặp qua chúng. Nó giữ một con trỏ đến một trong các phần tử trong danh sách. Mỗi mục trong danh sách phải có một khóa có thể được sử dụng để tìm mục đó.

Một trình lặp phải có các phương thức sau:

  • current[]  Trả về phần tử mà con trỏ hiện đang trỏ tới. Nó có thể là bất kỳ kiểu dữ liệu nào
  • key[] Trả về khóa được liên kết với phần tử hiện tại trong danh sách. Nó chỉ có thể là một số nguyên, float, boolean hoặc string
  • next[] Di chuyển con trỏ đến phần tử tiếp theo trong danh sách
  • rewind[] Di chuyển con trỏ đến phần tử đầu tiên trong danh sách
  • valid[] Nếu con trỏ bên trong không trỏ đến bất kỳ phần tử nào [ví dụ: nếu next [] được gọi ở cuối danh sách], điều này sẽ trả về false. Nó trả về true trong bất kỳ trường hợp nào khác

Ví dụ:

Iterator

Iterator về bản chất là một interface chuẩn được xây dựng sẵn trong PHP để bạn giễ dàng thao tác với các bộ giá trị. Cấu trúc của interface iterator trong PHP mặc định khai báo một số phương thức như sau:

interface Iterator{
  function rewind[];
  function current[];
  function key[];
  function next[];
  function valid[];
}

Vậy nên lớp nào sử dụng interface interator đều phải định nghĩa các phương thức trên. Chúng ta sẽ cùng xem xét một ví dụ về việc sử dụng interator để duyệt mảng trả về từ CSDL.

class QueryInterator implements Iterator{
    private $result;
    private $connection;
    private $key=0;
    private $valid;
    private $data;
   
    function __construct[$host, $user, $password, $dbname]{
        $this->connection = mysql_connect[$host,$user, $password];
        mysql_selectdb[$dbname,$this->connection];
    }
   
    public function exceute[$query]{
        $this->result = mysql_query[$query,$this->connection];
        if[mysql_num_rows[$this->result] > 0]{
            $this->next[];
        }
    }
   
    public function current[]{
        return $this->data;
    }
    public function rewind[]{}
    public function key[]{
        return $this->key;
    }
   
    public function next[]{
        if[$this->data = mysql_fetch_assoc[$this->result]]{
            $this->valid = true;
            $this->key +=1;
        }else{
            $this->valid = false;
        }
    }
   
    public function valid[]{
        return $this->valid;
    }
}
$q = new QueryInterator["localhost","root","","test"];
$q->exceute["SELECT name FROM ex1"];
echo '
';
while[$q->valid[]]{
    print_r[$q->current[]];
    $q->next[];
}
echo '
';

ArrayIterator

ArrayIterator về bản chất nó là đối tượng được xây dựng sẵn trong thư viện PHP chuẩn và lớp này sử dụng iterface iterator.

Trong bài viết trước có đề cập đến ArrayObject cũng là đối tượng được xây dựng sẵn trong thư viện PHP chuẩn và nó có phương thức __construct[] như sau:

__construct [$array, $flags=0, $iterator_class="ArrayIterator"]

Chúng ta thấy đối số thứ 3 mặc định đã được khởi tạo là "ArrayIterator" để đối tượng dạng mảng có thể sử dụng đối tượng ArrayIterator thông qua phương thức getIterator[].
ArrayItertor định nghĩa cho chúng ta bộ phương thức theo đúng interface iterator để thao tác với mảng. Bạn có thể xem ví dụ ở bài trước về ArrayObject với phương thức getIterator[].

Tham khảo "object-oriented programming with PHP5 _ Hasin Hayder".

Iterator

Iterator về bản chất là một interface chuẩn được xây dựng sẵn trong PHP để bạn giễ dàng thao tác với các bộ giá trị. Cấu trúc của interface iterator trong PHP mặc định khai báo một số phương thức như sau:

interface Iterator{
  function rewind[];
  function current[];
  function key[];
  function next[];
  function valid[];
}

Vậy nên lớp nào sử dụng interface interator đều phải định nghĩa các phương thức trên. Chúng ta sẽ cùng xem xét một ví dụ về việc sử dụng interator để duyệt mảng trả về từ CSDL.

class QueryInterator implements Iterator{
    private $result;
    private $connection;
    private $key=0;
    private $valid;
    private $data;
   
    function __construct[$host, $user, $password, $dbname]{
        $this->connection = mysql_connect[$host,$user, $password];
        mysql_selectdb[$dbname,$this->connection];
    }
   
    public function exceute[$query]{
        $this->result = mysql_query[$query,$this->connection];
        if[mysql_num_rows[$this->result] > 0]{
            $this->next[];
        }
    }
   
    public function current[]{
        return $this->data;
    }
    public function rewind[]{}
    public function key[]{
        return $this->key;
    }
   
    public function next[]{
        if[$this->data = mysql_fetch_assoc[$this->result]]{
            $this->valid = true;
            $this->key +=1;
        }else{
            $this->valid = false;
        }
    }
   
    public function valid[]{
        return $this->valid;
    }
}
$q = new QueryInterator["localhost","root","","test"];
$q->exceute["SELECT name FROM ex1"];
echo '
';
while[$q->valid[]]{
    print_r[$q->current[]];
    $q->next[];
}
echo '
';

ArrayIterator

ArrayIterator về bản chất nó là đối tượng được xây dựng sẵn trong thư viện PHP chuẩn và lớp này sử dụng iterface iterator.

Trong bài viết trước có đề cập đến ArrayObject cũng là đối tượng được xây dựng sẵn trong thư viện PHP chuẩn và nó có phương thức __construct[] như sau:

__construct [$array, $flags=0, $iterator_class="ArrayIterator"]

Chúng ta thấy đối số thứ 3 mặc định đã được khởi tạo là "ArrayIterator" để đối tượng dạng mảng có thể sử dụng đối tượng ArrayIterator thông qua phương thức getIterator[].
ArrayItertor định nghĩa cho chúng ta bộ phương thức theo đúng interface iterator để thao tác với mảng. Bạn có thể xem ví dụ ở bài trước về ArrayObject với phương thức getIterator[].

Tham khảo "object-oriented programming with PHP5 _ Hasin Hayder".

Chủ Đề